diff --git a/docs/changelog/144384.yaml b/docs/changelog/144384.yaml new file mode 100644 index 0000000000000..8905c611ed028 --- /dev/null +++ b/docs/changelog/144384.yaml @@ -0,0 +1,6 @@ +area: ES|QL +issues: + - 134886 +pr: 144384 +summary: Adding ES|QL USER_AGENT command +type: feature diff --git a/docs/reference/query-languages/esql/_snippets/commands/examples/user_agent.csv-spec/basic.md b/docs/reference/query-languages/esql/_snippets/commands/examples/user_agent.csv-spec/basic.md new file mode 100644 index 0000000000000..64cde8266f7ed --- /dev/null +++ b/docs/reference/query-languages/esql/_snippets/commands/examples/user_agent.csv-spec/basic.md @@ -0,0 +1,11 @@ +% This is generated by ESQL's CommandDocsTests. Do not edit it. See ../README.md for how to regenerate it. + +```esql +ROW input = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36" +| USER_AGENT ua = input WITH { "extract_device_type": true } +| KEEP ua.* +``` + +| ua.name:keyword | ua.version:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword | ua.device.name:keyword | ua.device.type:keyword | +| --- | --- | --- | --- | --- | --- | --- | +| Chrome | 33.0.1750.149 | Mac OS X | 10.9.2 | Mac OS X 10.9.2 | Mac | Desktop | diff --git a/docs/reference/query-languages/esql/_snippets/commands/layout/user_agent.md b/docs/reference/query-languages/esql/_snippets/commands/layout/user_agent.md new file mode 100644 index 0000000000000..44703b3edfb09 --- /dev/null +++ b/docs/reference/query-languages/esql/_snippets/commands/layout/user_agent.md @@ -0,0 +1,117 @@ +```yaml {applies_to} +serverless: preview +stack: preview 9.4 +``` + +The `USER_AGENT` processing command parses a user-agent string and extracts its components (name, version, OS, device) into new columns. + +::::{note} +This command doesn't support multi-value inputs. +:::: + + +## Syntax + +```esql +USER_AGENT prefix = expression [WITH { option = value [, ...] }] +``` + +## Parameters + +`prefix` +: The prefix for the output columns. The extracted components are available as `prefix.component`. + +`expression` +: The string expression containing the user-agent string to parse. + +## WITH options + +`regex_file` +: The name of the parser configuration to use. Default: `_default_`, which uses the built-in regexes from [uap-core](https://github.com/ua-parser/uap-core). To use a custom regex file, place a `.yml` file in the `config/user-agent` directory on each node before starting Elasticsearch. The file must be present at node startup; changes or new files added while the node is running have no effect. Pass the filename (including the `.yml` extension) as the value. Custom regex files are typically variants of the default, either a more recent uap-core release or a customized version. + +`extract_device_type` +: When `true`, extracts device type (e.g., Desktop, Phone, Tablet) on a best-effort basis and includes `prefix.device.type` in the output. Default: `false`. + +`properties` +: List of property groups to include in the output. Each value expands to one or more columns: `name` → `prefix.name`; `version` → `prefix.version`; `os` → `prefix.os.name`, `prefix.os.version`, `prefix.os.full`; `device` → `prefix.device.name` (and `prefix.device.type` when `extract_device_type` is `true`). Default: `["name", "version", "os", "device"]`. You can pass a subset to reduce output columns. + +## Using a custom regex file + +To use a custom regex file instead of the built-in uap-core patterns: + +1. Place a `.yml` file in the `config/user-agent` directory on each node. +2. Create the directory and file before starting Elasticsearch. +3. Pass the filename (including the `.yml` extension) as the `regex_file` option. + +Files must be present at node startup. Changes to existing files or new files added while the node is running have no effect until the node is restarted. + +::::{note} +Before version 9.4, this directory was named `config/ingest-user-agent`. The old directory name is still supported as a fallback but is deprecated. +:::: + +Custom regex files are typically variants of the default [uap-core regexes.yaml](https://github.com/ua-parser/uap-core/blob/master/regexes.yaml), either a more recent release or a customized version for specific user-agent patterns. Use a custom file when you need to support newer user-agent formats before they are available in the built-in patterns, or to parse specialized or non-standard user-agent strings. + +## Description + +The `USER_AGENT` command parses a user-agent string and extracts its parts into new columns. +The new columns are prefixed with the specified `prefix` followed by a dot (`.`). + +This command is the query-time equivalent of the [User-Agent ingest processor](/reference/enrich-processor/user-agent-processor.md). + +The following columns may be created (depending on `properties` and `extract_device_type`): + +`prefix.name` +: The user-agent name (e.g., Chrome, Firefox). + +`prefix.version` +: The user-agent version. + +`prefix.os.name` +: The operating system name. + +`prefix.os.version` +: The operating system version. + +`prefix.os.full` +: The full operating system string. + +`prefix.device.name` +: The device name. + +`prefix.device.type` +: The device type (e.g., Desktop, Phone). Only present when `extract_device_type` is `true`. + +If a component is missing or the input is not a valid user-agent string, the corresponding column contains `null`. +If the expression evaluates to `null` or blank, all output columns are `null`. + +## Examples + +The following example parses a user-agent string and extracts its parts: + +:::{include} ../examples/user_agent.csv-spec/basic.md +::: + +To limit output to specific properties or include device type, use the `properties` and `extract_device_type` options: + +```esql +ROW ua_str = "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15" +| USER_AGENT ua = ua_str WITH { "properties": ["name", "version", "device"], "extract_device_type": true } +| KEEP ua.* +``` + +To use a custom regex file (e.g. `my-regexes.yml` in `config/user-agent`), pass the filename including the extension: + +```esql +FROM web_logs +| USER_AGENT ua = user_agent WITH { "regex_file": "my-regexes.yml" } +| KEEP ua.name, ua.version +``` + +You can use the extracted parts in subsequent commands, for example to filter by browser: + +```esql +FROM web_logs +| USER_AGENT ua = user_agent +| WHERE ua.name == "Firefox" +| STATS COUNT(*) BY ua.version +``` diff --git a/docs/reference/query-languages/esql/_snippets/lists/processing-commands.md b/docs/reference/query-languages/esql/_snippets/lists/processing-commands.md index 4a85eedc3334c..eb28554c7d8a0 100644 --- a/docs/reference/query-languages/esql/_snippets/lists/processing-commands.md +++ b/docs/reference/query-languages/esql/_snippets/lists/processing-commands.md @@ -23,5 +23,6 @@ * [`SAMPLE`](/reference/query-languages/esql/commands/sample.md) {applies_to}`stack: preview 9.1` {applies_to}`serverless: preview` * [`SORT`](/reference/query-languages/esql/commands/sort.md) * [`STATS`](/reference/query-languages/esql/commands/stats-by.md) +% * [`USER_AGENT`](/reference/query-languages/esql/commands/user-agent.md) {applies_to}`stack: preview 9.4` {applies_to}`serverless: preview` * [`URI_PARTS`](/reference/query-languages/esql/commands/uri-parts.md) {applies_to}`stack: preview 9.4` {applies_to}`serverless: preview` * [`WHERE`](/reference/query-languages/esql/commands/where.md) diff --git a/docs/reference/query-languages/esql/commands/user-agent.md b/docs/reference/query-languages/esql/commands/user-agent.md new file mode 100644 index 0000000000000..11c329f9c4254 --- /dev/null +++ b/docs/reference/query-languages/esql/commands/user-agent.md @@ -0,0 +1,10 @@ +--- +navigation_title: "USER_AGENT" +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-user_agent +--- + +# {{esql}} `USER_AGENT` command [esql-user_agent] + +:::{include} ../_snippets/commands/layout/user_agent.md +::: diff --git a/docs/reference/query-languages/esql/kibana/definition/commands/user_agent.json b/docs/reference/query-languages/esql/kibana/definition/commands/user_agent.json new file mode 100644 index 0000000000000..36c2a2032d911 --- /dev/null +++ b/docs/reference/query-languages/esql/kibana/definition/commands/user_agent.json @@ -0,0 +1,5 @@ +{ + "comment" : "This is generated by ESQL’s DocsV3Support. Do not edit it. See ../README.md for how to regenerate it.", + "type" : "command", + "name" : "user_agent" +} diff --git a/docs/reference/query-languages/toc.yml b/docs/reference/query-languages/toc.yml index f2c4e705f7030..7dc8bfe6b6837 100644 --- a/docs/reference/query-languages/toc.yml +++ b/docs/reference/query-languages/toc.yml @@ -131,6 +131,7 @@ toc: - file: esql/commands/sample.md - file: esql/commands/sort.md - file: esql/commands/stats-by.md + - hidden: esql/commands/user-agent.md - file: esql/commands/uri-parts.md - file: esql/commands/where.md - file: esql/esql-functions-operators.md diff --git a/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentCache.java b/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentCache.java index 0f60ede01c3fe..51bb7512910a1 100644 --- a/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentCache.java +++ b/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentCache.java @@ -20,13 +20,13 @@ class UserAgentCache { cache = CacheBuilder.builder().setMaximumWeight(cacheSize).build(); } - public Details get(String parserName, String userAgent) { - return cache.get(new CompositeCacheKey(parserName, userAgent)); + public Details get(String parserName, String userAgent, boolean extractDeviceType) { + return cache.get(new CompositeCacheKey(parserName, userAgent, extractDeviceType)); } - public void put(String parserName, String userAgent, Details details) { - cache.put(new CompositeCacheKey(parserName, userAgent), details); + public void put(String parserName, String userAgent, Details details, boolean extractDeviceType) { + cache.put(new CompositeCacheKey(parserName, userAgent, extractDeviceType), details); } - private record CompositeCacheKey(String parserName, String userAgent) {} + private record CompositeCacheKey(String parserName, String userAgent, boolean extractDeviceType) {} } diff --git a/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserImpl.java b/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserImpl.java index 60d10d2e27f4f..4eca7dcbdb165 100644 --- a/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserImpl.java +++ b/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserImpl.java @@ -183,7 +183,7 @@ String getName() { @Override public Details parseUserAgentInfo(String agentString, boolean extractDeviceType) { - Details details = cache.get(name, agentString); + Details details = cache.get(name, agentString, extractDeviceType); if (details == null) { VersionedName userAgent = findMatch(uaPatterns, agentString); VersionedName operatingSystem = findMatch(osPatterns, agentString); @@ -199,7 +199,7 @@ public Details parseUserAgentInfo(String agentString, boolean extractDeviceType) VersionedName dev = (device != null && device.name() != null) ? device : null; details = new Details(uaName, uaVersion, os, osFull, dev, deviceType); - cache.put(name, agentString, details); + cache.put(name, agentString, details, extractDeviceType); } return details; } diff --git a/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserRegistry.java b/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserRegistryImpl.java similarity index 94% rename from modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserRegistry.java rename to modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserRegistryImpl.java index 139dff248fe26..8de5edc3c391c 100644 --- a/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserRegistry.java +++ b/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentParserRegistryImpl.java @@ -23,15 +23,15 @@ import java.util.Map; import java.util.stream.Stream; -public class UserAgentParserRegistry implements org.elasticsearch.useragent.api.UserAgentParserRegistry { +class UserAgentParserRegistryImpl implements org.elasticsearch.useragent.api.UserAgentParserRegistry { - private static final Logger logger = LogManager.getLogger(UserAgentParserRegistry.class); + private static final Logger logger = LogManager.getLogger(UserAgentParserRegistryImpl.class); static final String DEFAULT_PARSER_NAME = org.elasticsearch.useragent.api.UserAgentParserRegistry.DEFAULT_PARSER_NAME; private final Map registry; - UserAgentParserRegistry(UserAgentCache cache, Path... regexFileDirectories) { + UserAgentParserRegistryImpl(UserAgentCache cache, Path... regexFileDirectories) { registry = createParsersMap(cache, regexFileDirectories); } diff --git a/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentPlugin.java b/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentPlugin.java index 3c8b3e05f3741..bf2827889752b 100644 --- a/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentPlugin.java +++ b/modules/user-agent/src/main/java/org/elasticsearch/useragent/UserAgentPlugin.java @@ -15,6 +15,7 @@ import org.elasticsearch.env.Environment; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.plugins.UserAgentParserRegistryProvider; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; import java.nio.file.Path; import java.util.List; @@ -37,7 +38,7 @@ public class UserAgentPlugin extends Plugin implements UserAgentParserRegistryPr ); @Override - public org.elasticsearch.useragent.api.UserAgentParserRegistry createUserAgentParserRegistry(Environment env) { + public UserAgentParserRegistry createRegistry(Environment env) { return createRegistry(env, env.settings()); } @@ -56,6 +57,6 @@ public static UserAgentParserRegistry createRegistry(Environment env, Settings s Path ingestUserAgentConfigDirectory = env.configDir().resolve("ingest-user-agent"); long cacheSize = CACHE_SIZE_SETTING.get(settings); UserAgentCache cache = new UserAgentCache(cacheSize); - return new UserAgentParserRegistry(cache, userAgentConfigDirectory, ingestUserAgentConfigDirectory); + return new UserAgentParserRegistryImpl(cache, userAgentConfigDirectory, ingestUserAgentConfigDirectory); } } diff --git a/modules/user-agent/src/test/java/org/elasticsearch/useragent/UserAgentParserImplTests.java b/modules/user-agent/src/test/java/org/elasticsearch/useragent/UserAgentParserImplTests.java new file mode 100644 index 0000000000000..81fede89e6663 --- /dev/null +++ b/modules/user-agent/src/test/java/org/elasticsearch/useragent/UserAgentParserImplTests.java @@ -0,0 +1,354 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.useragent; + +import org.elasticsearch.ElasticsearchParseException; +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.useragent.api.Details; +import org.junit.BeforeClass; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; + +@SuppressWarnings("DataFlowIssue") +public class UserAgentParserImplTests extends ESTestCase { + + private static UserAgentParserImpl parser; + + @BeforeClass + public static void setupParser() { + InputStream regexStream = UserAgentPlugin.class.getResourceAsStream("/regexes.yml"); + InputStream deviceTypeRegexStream = UserAgentPlugin.class.getResourceAsStream("/device_type_regexes.yml"); + assertNotNull(regexStream); + assertNotNull(deviceTypeRegexStream); + parser = new UserAgentParserImpl("_default", regexStream, deviceTypeRegexStream, new UserAgentCache(1000)); + } + + public void testChromeMacOs() { + Details details = parser.parseUserAgentInfo( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36", + true + ); + + assertThat(details.name(), equalTo("Chrome")); + assertThat(details.version(), equalTo("33.0.1750.149")); + + assertThat(details.os(), notNullValue()); + assertThat(details.os().name(), equalTo("Mac OS X")); + assertThat(details.os().version(), equalTo("10.9.2")); + assertThat(details.osFull(), equalTo("Mac OS X 10.9.2")); + + assertThat(details.device(), notNullValue()); + assertThat(details.device().name(), equalTo("Mac")); + + assertThat(details.deviceType(), equalTo("Desktop")); + } + + public void testChromeWindows() { + Details details = parser.parseUserAgentInfo( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36", + true + ); + + assertThat(details.name(), equalTo("Chrome")); + assertThat(details.version(), equalTo("87.0.4280.141")); + + assertThat(details.os(), notNullValue()); + assertThat(details.os().name(), equalTo("Windows")); + assertThat(details.os().version(), equalTo("10")); + assertThat(details.osFull(), equalTo("Windows 10")); + + assertThat(details.device(), nullValue()); + + assertThat(details.deviceType(), equalTo("Desktop")); + } + + public void testFirefox() { + Details details = parser.parseUserAgentInfo( + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0", + true + ); + + assertThat(details.name(), equalTo("Firefox")); + assertThat(details.version(), equalTo("128.0")); + + assertThat(details.os(), notNullValue()); + assertThat(details.os().name(), equalTo("Windows")); + + assertThat(details.deviceType(), equalTo("Desktop")); + } + + public void testAndroidMobile() { + Details details = parser.parseUserAgentInfo( + "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10+ " + + "(KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2", + true + ); + + assertThat(details.name(), equalTo("Android")); + assertThat(details.version(), equalTo("3.0")); + + assertThat(details.os(), notNullValue()); + assertThat(details.os().name(), equalTo("Android")); + assertThat(details.os().version(), equalTo("3.0")); + + assertThat(details.device(), notNullValue()); + assertThat(details.device().name(), equalTo("Motorola Xoom")); + + assertThat(details.deviceType(), equalTo("Phone")); + } + + public void testIPadTablet() { + Details details = parser.parseUserAgentInfo( + "Mozilla/5.0 (iPad; CPU OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) " + + "Version/12.1 Mobile/15E148 Safari/604.1", + true + ); + + assertThat(details.name(), equalTo("Mobile Safari")); + assertThat(details.version(), equalTo("12.1")); + + assertThat(details.os(), notNullValue()); + assertThat(details.os().name(), equalTo("iOS")); + assertThat(details.os().version(), equalTo("12.2")); + + assertThat(details.device(), notNullValue()); + assertThat(details.device().name(), equalTo("iPad")); + + assertThat(details.deviceType(), equalTo("Tablet")); + } + + public void testSpider() { + Details details = parser.parseUserAgentInfo( + "Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)", + true + ); + + assertThat(details.name(), equalTo("EasouSpider")); + assertThat(details.version(), nullValue()); + + assertThat(details.os(), nullValue()); + assertThat(details.osFull(), nullValue()); + + assertThat(details.device(), notNullValue()); + assertThat(details.device().name(), equalTo("Spider")); + + assertThat(details.deviceType(), equalTo("Robot")); + } + + public void testUnknownAgent() { + Details details = parser.parseUserAgentInfo("Something I made up v42.0.1", true); + + assertThat(details.name(), nullValue()); + assertThat(details.version(), nullValue()); + assertThat(details.os(), nullValue()); + assertThat(details.osFull(), nullValue()); + assertThat(details.device(), nullValue()); + assertThat(details.deviceType(), equalTo("Other")); + } + + public void testExtractDeviceTypeDisabled() { + Details details = parser.parseUserAgentInfo( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + false + ); + + assertThat(details.name(), equalTo("Chrome")); + assertThat(details.os(), notNullValue()); + assertThat(details.os().name(), equalTo("Mac OS X")); + assertThat(details.deviceType(), nullValue()); + } + + public void testCachedResultsAreReturned() { + String ua = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"; + Details first = parser.parseUserAgentInfo(ua, true); + Details second = parser.parseUserAgentInfo(ua, true); + assertSame(first, second); + } + + public void testCacheIncludingDeviceTypes() { + String agentString = "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10+ (KHTML, like Gecko) " + + "Version/3.0.5 Mobile Safari/523.12.2"; + Details first = parser.parseUserAgentInfo(agentString, false); + assertNull(first.deviceType()); + Details second = parser.parseUserAgentInfo(agentString, true); + assertThat(second.deviceType(), equalTo("Phone")); + assertNotSame(first, second); + Details third = parser.parseUserAgentInfo(agentString, false); + assertSame(first, third); + } + + public void testVersionToStringMajorOnly() { + assertThat(UserAgentParserImpl.versionToString("10", null, null, null), equalTo("10")); + } + + public void testVersionToStringMajorMinor() { + assertThat(UserAgentParserImpl.versionToString("10", "9", null, null), equalTo("10.9")); + } + + public void testVersionToStringMajorMinorPatch() { + assertThat(UserAgentParserImpl.versionToString("10", "9", "2", null), equalTo("10.9.2")); + } + + public void testVersionToStringFull() { + assertThat(UserAgentParserImpl.versionToString("33", "0", "1750", "149"), equalTo("33.0.1750.149")); + } + + public void testVersionToStringNullMajor() { + assertThat(UserAgentParserImpl.versionToString(null, "1", "2", "3"), nullValue()); + } + + public void testVersionToStringEmptyMajor() { + assertThat(UserAgentParserImpl.versionToString("", "1", "2", "3"), nullValue()); + } + + public void testVersionToStringSkipsPatchWhenMinorMissing() { + assertThat(UserAgentParserImpl.versionToString("10", null, "2", null), equalTo("10")); + } + + public void testVersionToStringSkipsBuildWhenPatchMissing() { + assertThat(UserAgentParserImpl.versionToString("10", "9", null, "5"), equalTo("10.9")); + } + + public void testInvalidRegexFileThrows() { + byte[] invalidYaml = "not_a_valid_regex_file: true\n".getBytes(StandardCharsets.UTF_8); + expectThrows( + ElasticsearchParseException.class, + () -> new UserAgentParserImpl("bad", new ByteArrayInputStream(invalidYaml), null, new UserAgentCache(10)) + ); + } + + public void testNullDeviceTypeRegexStream() { + InputStream regexStream = UserAgentPlugin.class.getResourceAsStream("/regexes.yml"); + assertNotNull(regexStream); + UserAgentParserImpl parserWithoutDeviceType = new UserAgentParserImpl("no-device", regexStream, null, new UserAgentCache(10)); + + Details details = parserWithoutDeviceType.parseUserAgentInfo( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36", + true + ); + + assertThat(details.name(), equalTo("Chrome")); + assertThat(details.os(), notNullValue()); + assertThat(details.os().name(), equalTo("Mac OS X")); + assertThat(details.deviceType(), nullValue()); + } + + public void testOsMatchedWithoutVersion() { + Details details = parser.parseUserAgentInfo("Wget/1.21 (Ubuntu)", true); + + assertThat(details.name(), equalTo("Wget")); + + assertThat(details.os(), notNullValue()); + assertThat(details.os().name(), equalTo("Ubuntu")); + assertThat(details.os().version(), nullValue()); + assertThat(details.osFull(), nullValue()); + } + + public void testSubpatternMatchWithReplacements() { + var pattern = new UserAgentParserImpl.UserAgentSubpattern( + java.util.regex.Pattern.compile("(MyBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"), + null, + null, + null, + null, + null + ); + var result = pattern.match("MyBrowser/1.2.3.4"); + assertThat(result, notNullValue()); + assertThat(result.name(), equalTo("MyBrowser")); + assertThat(result.version(), equalTo("1.2.3.4")); + } + + public void testSubpatternMatchWithNameReplacement() { + var pattern = new UserAgentParserImpl.UserAgentSubpattern( + java.util.regex.Pattern.compile("(MyBrowser)/(\\d+)"), + "ReplacedName", + null, + null, + null, + null + ); + var result = pattern.match("MyBrowser/42"); + assertThat(result, notNullValue()); + assertThat(result.name(), equalTo("ReplacedName")); + assertThat(result.version(), equalTo("42")); + } + + public void testSubpatternMatchWithNameReplacementContainingGroupRef() { + var pattern = new UserAgentParserImpl.UserAgentSubpattern( + java.util.regex.Pattern.compile("(MyBrowser)/(\\d+)"), + "$1 Mobile", + null, + null, + null, + null + ); + var result = pattern.match("MyBrowser/42"); + assertThat(result, notNullValue()); + assertThat(result.name(), equalTo("MyBrowser Mobile")); + } + + public void testSubpatternMatchWithVersionReplacements() { + var pattern = new UserAgentParserImpl.UserAgentSubpattern( + java.util.regex.Pattern.compile("(MyBrowser)"), + null, + "99", + "88", + "77", + "66" + ); + var result = pattern.match("MyBrowser"); + assertThat(result, notNullValue()); + assertThat(result.name(), equalTo("MyBrowser")); + assertThat(result.version(), equalTo("99.88.77.66")); + } + + public void testSubpatternNoMatch() { + var pattern = new UserAgentParserImpl.UserAgentSubpattern( + java.util.regex.Pattern.compile("(NoSuchBrowser)"), + null, + null, + null, + null, + null + ); + assertThat(pattern.match("Chrome/1.0"), nullValue()); + } + + public void testSubpatternCaseInsensitiveFlag() { + var pattern = new UserAgentParserImpl.UserAgentSubpattern( + java.util.regex.Pattern.compile("(mybrowser)", java.util.regex.Pattern.CASE_INSENSITIVE), + null, + null, + null, + null, + null + ); + var result = pattern.match("MyBrowser/1.0"); + assertThat(result, notNullValue()); + assertThat(result.name(), equalTo("MyBrowser")); + } + + public void testGetName() { + assertThat(parser.getName(), equalTo("_default")); + } + + public void testPatternsLoadedFromRegexFile() { + assertThat(parser.getUaPatterns().isEmpty(), equalTo(false)); + assertThat(parser.getOsPatterns().isEmpty(), equalTo(false)); + assertThat(parser.getDevicePatterns().isEmpty(), equalTo(false)); + } +} diff --git a/modules/user-agent/src/test/java/org/elasticsearch/useragent/UserAgentParserRegistryImplTests.java b/modules/user-agent/src/test/java/org/elasticsearch/useragent/UserAgentParserRegistryImplTests.java new file mode 100644 index 0000000000000..b76236ad283c5 --- /dev/null +++ b/modules/user-agent/src/test/java/org/elasticsearch/useragent/UserAgentParserRegistryImplTests.java @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.useragent; + +import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.useragent.api.UserAgentParser; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Map; + +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; + +public class UserAgentParserRegistryImplTests extends ESTestCase { + + public void testDefaultParserAlwaysAvailable() { + UserAgentCache cache = new UserAgentCache(100); + Map parsers = UserAgentParserRegistryImpl.createParsersMap(cache); + assertThat(parsers.get(UserAgentParserRegistry.DEFAULT_PARSER_NAME), notNullValue()); + } + + public void testCustomRegexFileRegisteredWithYmlExtension() throws IOException { + Path configDir = createTempDir(); + copyBuiltinRegexesTo(configDir, "custom-regexes.yml"); + + UserAgentCache cache = new UserAgentCache(100); + Map parsers = UserAgentParserRegistryImpl.createParsersMap(cache, configDir); + + // The registry key includes the .yml extension + assertThat(parsers.get("custom-regexes.yml"), notNullValue()); + + // Without extension does NOT match + assertThat(parsers.get("custom-regexes"), nullValue()); + } + + public void testCustomRegexFileProducesValidParser() throws IOException { + Path configDir = createTempDir(); + copyBuiltinRegexesTo(configDir, "my-regexes.yml"); + + UserAgentCache cache = new UserAgentCache(100); + Map parsers = UserAgentParserRegistryImpl.createParsersMap(cache, configDir); + + UserAgentParser parser = parsers.get("my-regexes.yml"); + assertThat(parser, notNullValue()); + + // Verify the custom parser can actually parse a user-agent string + var details = parser.parseUserAgentInfo( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36", + false + ); + assertThat(details, notNullValue()); + assertEquals("Chrome", details.name()); + } + + public void testNonYmlFilesIgnored() throws IOException { + Path configDir = createTempDir(); + Files.writeString(configDir.resolve("not-a-regex.txt"), "this is not yaml"); + + UserAgentCache cache = new UserAgentCache(100); + Map parsers = UserAgentParserRegistryImpl.createParsersMap(cache, configDir); + + // Only the default parser should exist + assertEquals(1, parsers.size()); + assertThat(parsers.get(UserAgentParserRegistry.DEFAULT_PARSER_NAME), notNullValue()); + } + + public void testMultipleConfigDirectories() throws IOException { + Path configDir1 = createTempDir(); + Path configDir2 = createTempDir(); + copyBuiltinRegexesTo(configDir1, "regexes-a.yml"); + copyBuiltinRegexesTo(configDir2, "regexes-b.yml"); + + UserAgentCache cache = new UserAgentCache(100); + Map parsers = UserAgentParserRegistryImpl.createParsersMap(cache, configDir1, configDir2); + + assertThat(parsers.get(UserAgentParserRegistry.DEFAULT_PARSER_NAME), notNullValue()); + assertThat(parsers.get("regexes-a.yml"), notNullValue()); + assertThat(parsers.get("regexes-b.yml"), notNullValue()); + } + + public void testNonExistentDirectoryIgnored() { + Path nonExistent = createTempDir().resolve("does-not-exist"); + UserAgentCache cache = new UserAgentCache(100); + Map parsers = UserAgentParserRegistryImpl.createParsersMap(cache, nonExistent); + + // Only the default parser should exist + assertEquals(1, parsers.size()); + assertThat(parsers.get(UserAgentParserRegistry.DEFAULT_PARSER_NAME), notNullValue()); + } + + /** + * Copies the builtin regexes.yml into the given directory with the specified filename. + */ + private static void copyBuiltinRegexesTo(Path directory, String filename) throws IOException { + try (InputStream builtinRegexes = UserAgentPlugin.class.getResourceAsStream("/regexes.yml")) { + assertNotNull("builtin regexes.yml not found", builtinRegexes); + Files.copy(builtinRegexes, directory.resolve(filename)); + } + } +} diff --git a/server/src/main/java/org/elasticsearch/node/NodeConstruction.java b/server/src/main/java/org/elasticsearch/node/NodeConstruction.java index 611861ff0289f..2405f89b33531 100644 --- a/server/src/main/java/org/elasticsearch/node/NodeConstruction.java +++ b/server/src/main/java/org/elasticsearch/node/NodeConstruction.java @@ -752,7 +752,7 @@ private void construct( FailureStoreMetrics failureStoreMetrics = new FailureStoreMetrics(telemetryProvider.getMeterRegistry()); MatcherWatchdog matcherWatchdog = IngestService.createGrokThreadWatchdog(environment, threadPool); UserAgentParserRegistry userAgentParserRegistry = getSinglePlugin(UserAgentParserRegistryProvider.class).map( - p -> p.createUserAgentParserRegistry(environment) + p -> p.createRegistry(environment) ).orElse(UserAgentParserRegistry.NOOP); final IngestService ingestService = new IngestService( clusterService, @@ -1370,6 +1370,7 @@ public void sendRequest( b.bind(BigArrays.class).toInstance(bigArrays); b.bind(PageCacheRecycler.class).toInstance(pageCacheRecycler); b.bind(IngestService.class).toInstance(ingestService); + b.bind(UserAgentParserRegistry.class).toInstance(userAgentParserRegistry); b.bind(IndexingPressure.class).toInstance(indexingLimits); b.bind(IncrementalBulkService.class).toInstance(incrementalBulkService); b.bind(AggregationUsageService.class).toInstance(searchModule.getValuesSourceRegistry().getUsageService()); diff --git a/server/src/main/java/org/elasticsearch/plugins/UserAgentParserRegistryProvider.java b/server/src/main/java/org/elasticsearch/plugins/UserAgentParserRegistryProvider.java index b46468c761b76..6abaf9772b9f8 100644 --- a/server/src/main/java/org/elasticsearch/plugins/UserAgentParserRegistryProvider.java +++ b/server/src/main/java/org/elasticsearch/plugins/UserAgentParserRegistryProvider.java @@ -22,5 +22,5 @@ public interface UserAgentParserRegistryProvider { /** * Creates a {@link UserAgentParserRegistry} for the given environment. */ - UserAgentParserRegistry createUserAgentParserRegistry(Environment env); + UserAgentParserRegistry createRegistry(Environment env); } diff --git a/x-pack/plugin/esql/build.gradle b/x-pack/plugin/esql/build.gradle index 183a2d9aba415..275602d72d080 100644 --- a/x-pack/plugin/esql/build.gradle +++ b/x-pack/plugin/esql/build.gradle @@ -44,6 +44,7 @@ dependencies { implementation project(':libs:dissect') implementation project(':libs:grok') implementation project(':libs:web-utils') + implementation project(':libs:user-agent-api') implementation project(':libs:exponential-histogram') api "org.apache.lucene:lucene-spatial3d:${versions.lucene}" api "org.antlr:antlr4-runtime:${versions.antlr4}" @@ -83,11 +84,13 @@ dependencies { testImplementation project(path: ':modules:legacy-geo') testImplementation project(path: ':modules:data-streams') testImplementation project(path: ':modules:mapper-extras') + testImplementation project(path: ':modules:user-agent') testImplementation project(xpackModule('esql:compute:test')) testImplementation('ch.obermuhlner:big-math:2.3.2') testImplementation('net.nextencia:rrdiagram:0.9.4') testImplementation('org.webjars.npm:fontsource__roboto-mono:4.5.7') + internalClusterTestImplementation project(":modules:user-agent") internalClusterTestImplementation project(":modules:mapper-extras") internalClusterTestImplementation project(":plugins:mapper-size") internalClusterTestImplementation project(xpackModule('inference:qa:test-service-plugin')) diff --git a/x-pack/plugin/esql/qa/server/mixed-cluster/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/mixed/Clusters.java b/x-pack/plugin/esql/qa/server/mixed-cluster/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/mixed/Clusters.java index 1f5858738747f..1f83ac19e35ea 100644 --- a/x-pack/plugin/esql/qa/server/mixed-cluster/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/mixed/Clusters.java +++ b/x-pack/plugin/esql/qa/server/mixed-cluster/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/mixed/Clusters.java @@ -10,6 +10,7 @@ import org.elasticsearch.test.cluster.ElasticsearchCluster; import org.elasticsearch.test.cluster.local.distribution.DistributionType; import org.elasticsearch.test.cluster.util.Version; +import org.elasticsearch.test.cluster.util.resource.Resource; import org.elasticsearch.xpack.esql.CsvTestUtils; import java.nio.file.Path; @@ -31,7 +32,8 @@ public static ElasticsearchCluster mixedVersionCluster(Path csvDataPath) { .withNode(node -> node.version(Version.CURRENT)) .setting("xpack.security.enabled", "false") .setting("xpack.license.self_generated.type", "trial") - .setting("path.repo", csvDataPath::toString); + .setting("path.repo", csvDataPath::toString) + .configFile("user-agent/custom-regexes.yml", Resource.fromClasspath("custom-regexes.yml")); if (supportRetryOnShardFailures(oldVersion) == false) { cluster.setting("cluster.routing.rebalance.enable", "none"); } diff --git a/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/Clusters.java b/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/Clusters.java index 89f2e9f8afb83..9e3f82fca0fc2 100644 --- a/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/Clusters.java +++ b/x-pack/plugin/esql/qa/server/multi-clusters/src/javaRestTest/java/org/elasticsearch/xpack/esql/ccq/Clusters.java @@ -11,6 +11,7 @@ import org.elasticsearch.test.cluster.FeatureFlag; import org.elasticsearch.test.cluster.local.distribution.DistributionType; import org.elasticsearch.test.cluster.util.Version; +import org.elasticsearch.test.cluster.util.resource.Resource; import org.elasticsearch.xpack.esql.CsvTestUtils; import java.nio.file.Path; @@ -34,6 +35,7 @@ static ElasticsearchCluster remoteCluster(Path csvDataPath, Map .setting("xpack.security.enabled", "false") .setting("xpack.license.self_generated.type", "trial") .setting("path.repo", csvDataPath::toString) + .configFile("user-agent/custom-regexes.yml", Resource.fromClasspath("custom-regexes.yml")) .feature(FeatureFlag.ESQL_VIEWS) .shared(true); if (supportRetryOnShardFailures(version) == false) { @@ -100,6 +102,7 @@ public static ElasticsearchCluster localCluster( .setting("cluster.remote.connections_per_cluster", "1") .setting("cluster.remote." + REMOTE_CLUSTER_NAME + ".skip_unavailable", skipUnavailable.toString()) .setting("path.repo", csvDataPath::toString) + .configFile("user-agent/custom-regexes.yml", Resource.fromClasspath("custom-regexes.yml")) .feature(FeatureFlag.ESQL_VIEWS) .shared(true); if (supportRetryOnShardFailures(version) == false) { diff --git a/x-pack/plugin/esql/qa/server/multi-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/multi_node/Clusters.java b/x-pack/plugin/esql/qa/server/multi-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/multi_node/Clusters.java index 23e731af45b6b..54fbe720371fd 100644 --- a/x-pack/plugin/esql/qa/server/multi-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/multi_node/Clusters.java +++ b/x-pack/plugin/esql/qa/server/multi-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/multi_node/Clusters.java @@ -10,6 +10,7 @@ import org.elasticsearch.test.cluster.ElasticsearchCluster; import org.elasticsearch.test.cluster.local.LocalClusterConfigProvider; import org.elasticsearch.test.cluster.local.distribution.DistributionType; +import org.elasticsearch.test.cluster.util.resource.Resource; import org.elasticsearch.xpack.esql.CsvTestUtils; import java.nio.file.Path; @@ -26,6 +27,7 @@ public static ElasticsearchCluster testCluster(Path csvDataPath, LocalClusterCon .setting("xpack.security.enabled", "false") .setting("xpack.license.self_generated.type", "trial") .setting("path.repo", csvDataPath::toString) + .configFile("user-agent/custom-regexes.yml", Resource.fromClasspath("custom-regexes.yml")) .apply(() -> configProvider) .build(); } diff --git a/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/Clusters.java b/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/Clusters.java index 8e0a8726db481..108492528c96a 100644 --- a/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/Clusters.java +++ b/x-pack/plugin/esql/qa/server/single-node/src/javaRestTest/java/org/elasticsearch/xpack/esql/qa/single_node/Clusters.java @@ -11,6 +11,7 @@ import org.elasticsearch.test.cluster.FeatureFlag; import org.elasticsearch.test.cluster.local.LocalClusterConfigProvider; import org.elasticsearch.test.cluster.local.distribution.DistributionType; +import org.elasticsearch.test.cluster.util.resource.Resource; import org.elasticsearch.xpack.esql.CsvTestUtils; import java.nio.file.Path; @@ -32,6 +33,7 @@ public static ElasticsearchCluster testCluster(Path csvDataPath, LocalClusterCon .setting("xpack.license.self_generated.type", "trial") .setting("path.repo", csvDataPath::toString) .shared(true) + .configFile("user-agent/custom-regexes.yml", Resource.fromClasspath("custom-regexes.yml")) .apply(() -> configProvider) .feature(FeatureFlag.EXTENDED_DOC_VALUES_PARAMS) .build(); diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java index f91d4b4bf8e02..539f431c1e124 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/EsqlTestUtils.java @@ -77,6 +77,7 @@ import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.RemoteTransportException; import org.elasticsearch.transport.TransportService; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; import org.elasticsearch.xcontent.XContentType; import org.elasticsearch.xcontent.json.JsonXContent; import org.elasticsearch.xpack.core.analytics.mapper.EncodedTDigest; @@ -723,6 +724,7 @@ public static LogicalOptimizerContext unboundLogicalOptimizerContext() { mock(IndexNameExpressionResolver.class), null, new InferenceService(mock(Client.class), clusterService), + UserAgentParserRegistry.NOOP, new BlockFactoryProvider(PlannerUtils.NON_BREAKING_BLOCK_FACTORY), new PlannerSettings.Holder(clusterService), CrossProjectModeDecider.NOOP diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/EsqlQueryGenerator.java b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/EsqlQueryGenerator.java index 0bd06e3b05cab..435465583ff5f 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/EsqlQueryGenerator.java +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/EsqlQueryGenerator.java @@ -29,6 +29,7 @@ import org.elasticsearch.xpack.esql.generator.command.pipe.StatsGenerator; import org.elasticsearch.xpack.esql.generator.command.pipe.TimeSeriesStatsGenerator; import org.elasticsearch.xpack.esql.generator.command.pipe.UriPartsGenerator; +import org.elasticsearch.xpack.esql.generator.command.pipe.UserAgentGenerator; import org.elasticsearch.xpack.esql.generator.command.pipe.WhereGenerator; import org.elasticsearch.xpack.esql.generator.command.source.FromGenerator; import org.elasticsearch.xpack.esql.generator.command.source.PromQLGenerator; @@ -121,6 +122,7 @@ public class EsqlQueryGenerator { SortGenerator.INSTANCE, StatsGenerator.INSTANCE, UriPartsGenerator.INSTANCE, + UserAgentGenerator.INSTANCE, RegisteredDomainGenerator.INSTANCE, WhereGenerator.INSTANCE ); diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/UserAgentGenerator.java b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/UserAgentGenerator.java new file mode 100644 index 0000000000000..fbfd168378037 --- /dev/null +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/java/org/elasticsearch/xpack/esql/generator/command/pipe/UserAgentGenerator.java @@ -0,0 +1,195 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.generator.command.pipe; + +import org.elasticsearch.xpack.esql.generator.Column; +import org.elasticsearch.xpack.esql.generator.EsqlQueryGenerator; +import org.elasticsearch.xpack.esql.generator.QueryExecutor; +import org.elasticsearch.xpack.esql.generator.command.CommandGenerator; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.elasticsearch.test.ESTestCase.randomBoolean; +import static org.elasticsearch.test.ESTestCase.randomFrom; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.DEVICE_NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_FULL; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_VERSION; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.VERSION; + +/** + * Generator for the USER_AGENT pipe command. Produces {@code | user_agent = } + * with no WITH clause (default properties and extract_device_type=false). + */ +public class UserAgentGenerator implements CommandGenerator { + + public static final CommandGenerator INSTANCE = new UserAgentGenerator(); + + public static final String USER_AGENT = "user_agent"; + + private static final String PREFIX = "prefix"; + + /** + * Default output fields when USER_AGENT is used without WITH clause: extractDeviceType=false, + * properties=["name", "version", "os", "device"] → device.name but not device.type. + */ + private static final LinkedHashMap USER_AGENT_DEFAULT_OUTPUT_FIELDS = new LinkedHashMap<>(); + static { + USER_AGENT_DEFAULT_OUTPUT_FIELDS.put(NAME, "keyword"); + USER_AGENT_DEFAULT_OUTPUT_FIELDS.put(VERSION, "keyword"); + USER_AGENT_DEFAULT_OUTPUT_FIELDS.put(OS_NAME, "keyword"); + USER_AGENT_DEFAULT_OUTPUT_FIELDS.put(OS_VERSION, "keyword"); + USER_AGENT_DEFAULT_OUTPUT_FIELDS.put(OS_FULL, "keyword"); + USER_AGENT_DEFAULT_OUTPUT_FIELDS.put(DEVICE_NAME, "keyword"); + } + + private static final String[] LITERAL_USER_AGENTS = new String[] { + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", + "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0", + "curl/7.68.0", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)", + "FileZilla/3.57.0", + "Go-http-client/1.1", + "Uptime-Robot/1.0" }; + + private static final Set USER_AGENT_LIKE_FIELD_NAMES = Set.of("user_agent", "useragent", "ua"); + + @Override + public CommandDescription generate( + List previousCommands, + List previousOutput, + QuerySchema schema, + QueryExecutor executor + ) { + String inputExpression = pickUserAgentInput(previousOutput); + if (inputExpression == null) { + return EMPTY_DESCRIPTION; + } + String prefixRaw = EsqlQueryGenerator.randomIdentifier(); + String prefixForCmd = EsqlQueryGenerator.needsQuoting(prefixRaw) ? EsqlQueryGenerator.quote(prefixRaw) : prefixRaw; + String cmdString = " | user_agent " + prefixForCmd + " = " + inputExpression; + return new CommandDescription(USER_AGENT, this, cmdString, Map.of(PREFIX, prefixRaw)); + } + + private static String pickUserAgentInput(List previousOutput) { + if (randomBoolean()) { + return "\"" + randomFrom(LITERAL_USER_AGENTS) + "\""; + } + return userAgentLikeFieldOrRandomString(previousOutput); + } + + private static String userAgentLikeFieldOrRandomString(List previousOutput) { + List stringColumns = previousOutput.stream() + .filter(c -> "keyword".equals(c.type()) || "text".equals(c.type())) + .filter(EsqlQueryGenerator::fieldCanBeUsed) + .toList(); + if (stringColumns.isEmpty()) { + return null; + } + for (Column c : stringColumns) { + String name = c.name(); + if (USER_AGENT_LIKE_FIELD_NAMES.contains(EsqlQueryGenerator.unquote(name))) { + return EsqlQueryGenerator.needsQuoting(name) ? EsqlQueryGenerator.quote(name) : name; + } + } + Column chosen = randomFrom(stringColumns); + String name = chosen.name(); + return EsqlQueryGenerator.needsQuoting(name) ? EsqlQueryGenerator.quote(name) : name; + } + + @Override + public ValidationResult validateOutput( + List previousCommands, + CommandDescription commandDescription, + List previousColumns, + List> previousOutput, + List columns, + List> output + ) { + if (commandDescription == EMPTY_DESCRIPTION) { + return VALIDATION_OK; + } + + String prefix = (String) commandDescription.context().get(PREFIX); + if (prefix == null) { + return new ValidationResult(false, "Missing prefix in command context"); + } + + int expectedColumns = USER_AGENT_DEFAULT_OUTPUT_FIELDS.size(); + int expectedTotal = previousColumns.size() + expectedColumns; + if (columns.size() != expectedTotal) { + return new ValidationResult( + false, + "Expecting [" + + expectedTotal + + "] columns (" + + previousColumns.size() + + " previous + " + + expectedColumns + + " USER_AGENT), got [" + + columns.size() + + "]" + ); + } + + var it = columns.iterator(); + int pos = 0; + + for (Column prev : previousColumns) { + if (it.hasNext() == false) { + return new ValidationResult(false, "Missing previous column [" + prev.name() + "] in output"); + } + Column actual = it.next(); + pos++; + if (actual.name().equals(prev.name()) == false) { + return new ValidationResult( + false, + "At position " + pos + ": expected column [" + prev.name() + "], got [" + actual.name() + "]" + ); + } + if (actual.type().equals(prev.type()) == false) { + return new ValidationResult( + false, + "Column [" + prev.name() + "] type changed from [" + prev.type() + "] to [" + actual.type() + "]" + ); + } + } + + for (Map.Entry e : USER_AGENT_DEFAULT_OUTPUT_FIELDS.entrySet()) { + if (it.hasNext() == false) { + return new ValidationResult( + false, + "Missing USER_AGENT column [" + prefix + "." + e.getKey() + "] (expected type [" + e.getValue() + "])" + ); + } + Column actual = it.next(); + pos++; + String expectedName = prefix + "." + e.getKey(); + String expectedType = e.getValue(); + if (actual.name().equals(expectedName) == false) { + return new ValidationResult( + false, + "At position " + pos + ": expected USER_AGENT column [" + expectedName + "], got [" + actual.name() + "]" + ); + } + if (actual.type().equals(expectedType) == false) { + return new ValidationResult( + false, + "USER_AGENT column [" + expectedName + "] expected type [" + expectedType + "], got [" + actual.type() + "]" + ); + } + } + + return CommandGenerator.expectSameRowCount(previousCommands, previousOutput, output); + } +} diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/custom-regexes.yml b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/custom-regexes.yml new file mode 100644 index 0000000000000..0607bfaf96571 --- /dev/null +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/custom-regexes.yml @@ -0,0 +1,18 @@ +# Minimal custom regex file for testing the USER_AGENT command's regex_file option. +# This file intentionally uses a simplified set of patterns that produce different +# results than the default uap-core regexes, so tests can verify the custom file +# was actually loaded and used. +# +# Differences from the default parser for the Chrome UA string used in tests: +# - name: "Custom Chrome" instead of "Chrome" + +user_agent_parsers: + - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)' + family_replacement: 'Custom Chrome' + +os_parsers: + - regex: 'Intel (Mac OS X) (\d+)[_.](\d+)(?:[_.](\d+)|)' + +device_parsers: + - regex: '(Macintosh)' + device_replacement: 'Mac' diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/user_agent.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/user_agent.csv-spec new file mode 100644 index 0000000000000..1979c0936abd3 --- /dev/null +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/user_agent.csv-spec @@ -0,0 +1,210 @@ +basic +required_capability: user_agent_command + +// tag::basic[] +ROW input = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36" +| USER_AGENT ua = input WITH { "extract_device_type": true } +| KEEP ua.* +// end::basic[] +; + +// tag::basic-result[] +ua.name:keyword | ua.version:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword | ua.device.name:keyword | ua.device.type:keyword +Chrome | 33.0.1750.149 | Mac OS X | 10.9.2 | Mac OS X 10.9.2 | Mac | Desktop +// end::basic-result[] +; + + +withoutDeviceType +required_capability: user_agent_command + +ROW input = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36" +| USER_AGENT ua = input +| KEEP ua.* +; + +ua.name:keyword | ua.version:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword | ua.device.name:keyword +Chrome | 33.0.1750.149 | Mac OS X | 10.9.2 | Mac OS X 10.9.2 | Mac +; + + +emptyOptions +required_capability: user_agent_command + +ROW input = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36" +| USER_AGENT ua = input WITH {} +| KEEP ua.* +; + +ua.name:keyword | ua.version:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword | ua.device.name:keyword +Chrome | 33.0.1750.149 | Mac OS X | 10.9.2 | Mac OS X 10.9.2 | Mac +; + + +propertiesFilter +required_capability: user_agent_command + +ROW input = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36" +| USER_AGENT ua = input WITH { "properties": ["name", "os"] } +| KEEP ua.* +; + +ua.name:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword +Chrome | Mac OS X | 10.9.2 | Mac OS X 10.9.2 +; + + +dottedPrefix +required_capability: user_agent_command + +ROW input = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36" +| USER_AGENT a.b.c = input +| KEEP a.b.c.name, a.b.c.version +; + +a.b.c.name:keyword | a.b.c.version:keyword +Chrome | 33.0.1750.149 +; + + +testAfterFiltering +required_capability: user_agent_command + +FROM web_logs +| WHERE domain == "www.elastic.co" +| USER_AGENT ua = user_agent +| KEEP ua.name, ua.version +| SORT ua.name +; + +ua.name:keyword | ua.version:keyword +Firefox | 119.0 +null | null +; + + +testBeforeFiltering +required_capability: user_agent_command + +FROM web_logs +| USER_AGENT ua = user_agent +| WHERE ua.name == "Firefox" +| KEEP ua.name, ua.version, ua.os.name +; + +ua.name:keyword | ua.version:keyword | ua.os.name:keyword +Firefox | 119.0 | Ubuntu +; + + +prefixSameAsInputFieldName +required_capability: user_agent_command + +FROM web_logs +| WHERE timestamp == "2024-01-10T10:07:22.111Z" +| USER_AGENT user_agent = user_agent +| KEEP user_agent.name, user_agent.version +; + +user_agent.name:keyword | user_agent.version:keyword +Firefox | 119.0 +; + + +testNonBrowserAgent +required_capability: user_agent_command + +FROM web_logs +| WHERE domain == "app.example.com" +| USER_AGENT ua = user_agent +| KEEP ua.name, ua.version, ua.os.name +; + +ua.name:keyword | ua.version:keyword | ua.os.name:keyword +curl | 7.68.0 | null +; + + +multiValue +required_capability: user_agent_command + +ROW input = ["Mozilla/5.0 Chrome/33.0", "curl/7.68.0"] +| USER_AGENT ua = input +| KEEP ua.name +; +warningregex: Line 2:3: java.lang.IllegalArgumentException: This command doesn't support multi-value input +warningregex: Line 2:3: evaluation of \[USER_AGENT.* ua = input\] failed, treating result as null + +ua.name:keyword +null +; + + +emptyStringInput +required_capability: user_agent_command + +ROW input = "" +| USER_AGENT ua = input +| KEEP ua.* +; + +ua.name:keyword | ua.version:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword | ua.device.name:keyword +null | null | null | null | null | null +; + + +emptyStringInputWithDeviceType +required_capability: user_agent_command + +ROW input = "" +| USER_AGENT ua = input WITH { "extract_device_type": true } +| KEEP ua.* +; + +ua.name:keyword | ua.version:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword | ua.device.name:keyword | ua.device.type:keyword +null | null | null | null | null | null | null +; + + +nullInputRow +required_capability: user_agent_command +required_capability: str_commands_accept_null + +ROW n = null +| USER_AGENT ua = n +; + +n:null | ua.name:keyword | ua.version:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword | ua.device.name:keyword + null | null | null | null | null | null | null +; + + +nullInput +required_capability: user_agent_command +required_capability: str_commands_accept_null + +FROM web_logs +| EVAL n = null +| USER_AGENT ua = n +| KEEP n, ua.* +| LIMIT 3 +; + +n:null | ua.name:keyword | ua.version:keyword | ua.os.name:keyword | ua.os.version:keyword | ua.os.full:keyword | ua.device.name:keyword + null | null | null | null | null | null | null + null | null | null | null | null | null | null + null | null | null | null | null | null | null +; + + +customRegexFile +required_capability: user_agent_command + +ROW input = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36" +| USER_AGENT ua = input WITH { "regex_file": "custom-regexes.yml" } +| KEEP ua.name, ua.version, ua.os.name +; + +ua.name:keyword | ua.version:keyword | ua.os.name:keyword +Custom Chrome | 33.0.1750.149 | Mac OS X +; diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/CsvIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/CsvIT.java index 73c2b59b20d4b..1a0965781d249 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/CsvIT.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/CsvIT.java @@ -43,6 +43,7 @@ import org.elasticsearch.transport.TransportRequest; import org.elasticsearch.transport.TransportRequestHandler; import org.elasticsearch.transport.TransportService; +import org.elasticsearch.useragent.UserAgentPlugin; import org.elasticsearch.xcontent.XContentParserConfiguration; import org.elasticsearch.xcontent.XContentType; import org.elasticsearch.xcontent.json.JsonXContent; @@ -83,7 +84,10 @@ import org.junit.BeforeClass; import java.io.IOException; +import java.io.InputStream; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Collection; import java.util.HashSet; import java.util.List; @@ -154,8 +158,11 @@ public static List readScriptSpec() throws Exception { return SpecReader.readScriptSpec(urls, specParser()); } + private static java.nio.file.Path nodeConfigDir; + @BeforeClass public static void setupCluster() throws Exception { + nodeConfigDir = createConfigDir(); long start = System.currentTimeMillis(); logger.info("Creating test cluster"); cluster = new InternalTestCluster( @@ -177,7 +184,7 @@ public Settings nodeSettings(int nodeOrdinal, Settings otherSettings) { @Override public java.nio.file.Path nodeConfigPath(int nodeOrdinal) { - return null; + return nodeConfigDir; } }, 0, @@ -195,6 +202,7 @@ public java.nio.file.Path nodeConfigPath(int nodeOrdinal) { MapperExtrasPlugin.class, SpatialPlugin.class, UnsignedLongMapperPlugin.class, + UserAgentPlugin.class, VersionFieldPlugin.class, Wildcard.class ), @@ -539,6 +547,20 @@ public void ensureNoFailures() { } } + private static Path createConfigDir() throws IOException { + Path configDir = createTempDir(); + + // create a subdir for the user-agent with custom regex files so we can test the USER_AGENT with the regex_file option + Path userAgentDir = configDir.resolve("user-agent"); + Files.createDirectories(userAgentDir); + try (InputStream is = CsvIT.class.getResourceAsStream("/custom-regexes.yml")) { + assert is != null : "custom-regexes.yml not found on classpath"; + Files.copy(is, userAgentDir.resolve("custom-regexes.yml")); + } + + return configDir; + } + private static class ResponseListener extends PlainActionFuture { private final ThreadPool threadPool; private List warnings; diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens index 2ff6a1be1bc7d..9ef1824e73446 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens @@ -19,153 +19,154 @@ URI_PARTS=18 METRICS_INFO=19 REGISTERED_DOMAIN=20 TS_INFO=21 -FROM=22 -TS=23 -DEV_EXTERNAL=24 -FORK=25 -FUSE=26 -INLINE=27 -INLINESTATS=28 -JOIN_LOOKUP=29 -DEV_JOIN_FULL=30 -DEV_JOIN_LEFT=31 -DEV_JOIN_RIGHT=32 -DEV_LOOKUP=33 -MMR=34 -MV_EXPAND=35 -DROP=36 -KEEP=37 -DEV_INSIST=38 -PROMQL=39 -RENAME=40 -SET=41 -SHOW=42 -UNKNOWN_CMD=43 -CHANGE_POINT_LINE_COMMENT=44 -CHANGE_POINT_MULTILINE_COMMENT=45 -CHANGE_POINT_WS=46 -ENRICH_POLICY_NAME=47 -ENRICH_LINE_COMMENT=48 -ENRICH_MULTILINE_COMMENT=49 -ENRICH_WS=50 -ENRICH_FIELD_LINE_COMMENT=51 -ENRICH_FIELD_MULTILINE_COMMENT=52 -ENRICH_FIELD_WS=53 -EXPLAIN_WS=54 -EXPLAIN_LINE_COMMENT=55 -EXPLAIN_MULTILINE_COMMENT=56 -PIPE=57 -QUOTED_STRING=58 -INTEGER_LITERAL=59 -DECIMAL_LITERAL=60 -AND=61 -ASC=62 -ASSIGN=63 -BY=64 -CAST_OP=65 -COLON=66 -SEMICOLON=67 -COMMA=68 -DESC=69 -DOT=70 -FALSE=71 -FIRST=72 -IN=73 -IS=74 -LAST=75 -LIKE=76 -NOT=77 -NULL=78 -NULLS=79 -ON=80 -OR=81 -PARAM=82 -RLIKE=83 -TRUE=84 -WITH=85 -EQ=86 -CIEQ=87 -NEQ=88 -LT=89 -LTE=90 -GT=91 -GTE=92 -PLUS=93 -MINUS=94 -ASTERISK=95 -SLASH=96 -PERCENT=97 -LEFT_BRACES=98 -RIGHT_BRACES=99 -DOUBLE_PARAMS=100 -NAMED_OR_POSITIONAL_PARAM=101 -NAMED_OR_POSITIONAL_DOUBLE_PARAMS=102 -OPENING_BRACKET=103 -CLOSING_BRACKET=104 -LP=105 -RP=106 -UNQUOTED_IDENTIFIER=107 -QUOTED_IDENTIFIER=108 -EXPR_LINE_COMMENT=109 -EXPR_MULTILINE_COMMENT=110 -EXPR_WS=111 -METADATA=112 -UNQUOTED_SOURCE=113 -FROM_LINE_COMMENT=114 -FROM_MULTILINE_COMMENT=115 -FROM_WS=116 -FORK_WS=117 -FORK_LINE_COMMENT=118 -FORK_MULTILINE_COMMENT=119 -GROUP=120 -SCORE=121 -KEY=122 -FUSE_LINE_COMMENT=123 -FUSE_MULTILINE_COMMENT=124 -FUSE_WS=125 -INLINE_STATS=126 -INLINE_LINE_COMMENT=127 -INLINE_MULTILINE_COMMENT=128 -INLINE_WS=129 -JOIN=130 -USING=131 -JOIN_LINE_COMMENT=132 -JOIN_MULTILINE_COMMENT=133 -JOIN_WS=134 -LOOKUP_LINE_COMMENT=135 -LOOKUP_MULTILINE_COMMENT=136 -LOOKUP_WS=137 -LOOKUP_FIELD_LINE_COMMENT=138 -LOOKUP_FIELD_MULTILINE_COMMENT=139 -LOOKUP_FIELD_WS=140 -MMR_LIMIT=141 -MMR_LINE_COMMENT=142 -MMR_MULTILINE_COMMENT=143 -MMR_WS=144 -MVEXPAND_LINE_COMMENT=145 -MVEXPAND_MULTILINE_COMMENT=146 -MVEXPAND_WS=147 -ID_PATTERN=148 -PROJECT_LINE_COMMENT=149 -PROJECT_MULTILINE_COMMENT=150 -PROJECT_WS=151 -PROMQL_PARAMS_LINE_COMMENT=152 -PROMQL_PARAMS_MULTILINE_COMMENT=153 -PROMQL_PARAMS_WS=154 -PROMQL_QUERY_COMMENT=155 -PROMQL_SINGLE_QUOTED_STRING=156 -PROMQL_OTHER_QUERY_CONTENT=157 -AS=158 -RENAME_LINE_COMMENT=159 -RENAME_MULTILINE_COMMENT=160 -RENAME_WS=161 -SET_LINE_COMMENT=162 -SET_MULTILINE_COMMENT=163 -SET_WS=164 -INFO=165 -SHOW_LINE_COMMENT=166 -SHOW_MULTILINE_COMMENT=167 -SHOW_WS=168 +USER_AGENT=22 +FROM=23 +TS=24 +DEV_EXTERNAL=25 +FORK=26 +FUSE=27 +INLINE=28 +INLINESTATS=29 +JOIN_LOOKUP=30 +DEV_JOIN_FULL=31 +DEV_JOIN_LEFT=32 +DEV_JOIN_RIGHT=33 +DEV_LOOKUP=34 +MMR=35 +MV_EXPAND=36 +DROP=37 +KEEP=38 +DEV_INSIST=39 +PROMQL=40 +RENAME=41 +SET=42 +SHOW=43 +UNKNOWN_CMD=44 +CHANGE_POINT_LINE_COMMENT=45 +CHANGE_POINT_MULTILINE_COMMENT=46 +CHANGE_POINT_WS=47 +ENRICH_POLICY_NAME=48 +ENRICH_LINE_COMMENT=49 +ENRICH_MULTILINE_COMMENT=50 +ENRICH_WS=51 +ENRICH_FIELD_LINE_COMMENT=52 +ENRICH_FIELD_MULTILINE_COMMENT=53 +ENRICH_FIELD_WS=54 +EXPLAIN_WS=55 +EXPLAIN_LINE_COMMENT=56 +EXPLAIN_MULTILINE_COMMENT=57 +PIPE=58 +QUOTED_STRING=59 +INTEGER_LITERAL=60 +DECIMAL_LITERAL=61 +AND=62 +ASC=63 +ASSIGN=64 +BY=65 +CAST_OP=66 +COLON=67 +SEMICOLON=68 +COMMA=69 +DESC=70 +DOT=71 +FALSE=72 +FIRST=73 +IN=74 +IS=75 +LAST=76 +LIKE=77 +NOT=78 +NULL=79 +NULLS=80 +ON=81 +OR=82 +PARAM=83 +RLIKE=84 +TRUE=85 +WITH=86 +EQ=87 +CIEQ=88 +NEQ=89 +LT=90 +LTE=91 +GT=92 +GTE=93 +PLUS=94 +MINUS=95 +ASTERISK=96 +SLASH=97 +PERCENT=98 +LEFT_BRACES=99 +RIGHT_BRACES=100 +DOUBLE_PARAMS=101 +NAMED_OR_POSITIONAL_PARAM=102 +NAMED_OR_POSITIONAL_DOUBLE_PARAMS=103 +OPENING_BRACKET=104 +CLOSING_BRACKET=105 +LP=106 +RP=107 +UNQUOTED_IDENTIFIER=108 +QUOTED_IDENTIFIER=109 +EXPR_LINE_COMMENT=110 +EXPR_MULTILINE_COMMENT=111 +EXPR_WS=112 +METADATA=113 +UNQUOTED_SOURCE=114 +FROM_LINE_COMMENT=115 +FROM_MULTILINE_COMMENT=116 +FROM_WS=117 +FORK_WS=118 +FORK_LINE_COMMENT=119 +FORK_MULTILINE_COMMENT=120 +GROUP=121 +SCORE=122 +KEY=123 +FUSE_LINE_COMMENT=124 +FUSE_MULTILINE_COMMENT=125 +FUSE_WS=126 +INLINE_STATS=127 +INLINE_LINE_COMMENT=128 +INLINE_MULTILINE_COMMENT=129 +INLINE_WS=130 +JOIN=131 +USING=132 +JOIN_LINE_COMMENT=133 +JOIN_MULTILINE_COMMENT=134 +JOIN_WS=135 +LOOKUP_LINE_COMMENT=136 +LOOKUP_MULTILINE_COMMENT=137 +LOOKUP_WS=138 +LOOKUP_FIELD_LINE_COMMENT=139 +LOOKUP_FIELD_MULTILINE_COMMENT=140 +LOOKUP_FIELD_WS=141 +MMR_LIMIT=142 +MMR_LINE_COMMENT=143 +MMR_MULTILINE_COMMENT=144 +MMR_WS=145 +MVEXPAND_LINE_COMMENT=146 +MVEXPAND_MULTILINE_COMMENT=147 +MVEXPAND_WS=148 +ID_PATTERN=149 +PROJECT_LINE_COMMENT=150 +PROJECT_MULTILINE_COMMENT=151 +PROJECT_WS=152 +PROMQL_PARAMS_LINE_COMMENT=153 +PROMQL_PARAMS_MULTILINE_COMMENT=154 +PROMQL_PARAMS_WS=155 +PROMQL_QUERY_COMMENT=156 +PROMQL_SINGLE_QUOTED_STRING=157 +PROMQL_OTHER_QUERY_CONTENT=158 +AS=159 +RENAME_LINE_COMMENT=160 +RENAME_MULTILINE_COMMENT=161 +RENAME_WS=162 +SET_LINE_COMMENT=163 +SET_MULTILINE_COMMENT=164 +SET_WS=165 +INFO=166 +SHOW_LINE_COMMENT=167 +SHOW_MULTILINE_COMMENT=168 +SHOW_WS=169 'change_point'=4 'enrich'=5 'completion'=7 @@ -182,69 +183,70 @@ SHOW_WS=168 'metrics_info'=19 'registered_domain'=20 'ts_info'=21 -'from'=22 -'ts'=23 -'fork'=25 -'fuse'=26 -'inline'=27 -'inlinestats'=28 -'lookup'=29 -'mmr'=34 -'mv_expand'=35 -'drop'=36 -'keep'=37 -'promql'=39 -'rename'=40 -'set'=41 -'show'=42 -'|'=57 -'and'=61 -'asc'=62 -'='=63 -'by'=64 -'::'=65 -':'=66 -';'=67 -','=68 -'desc'=69 -'.'=70 -'false'=71 -'first'=72 -'in'=73 -'is'=74 -'last'=75 -'like'=76 -'not'=77 -'null'=78 -'nulls'=79 -'on'=80 -'or'=81 -'?'=82 -'rlike'=83 -'true'=84 -'with'=85 -'=='=86 -'=~'=87 -'!='=88 -'<'=89 -'<='=90 -'>'=91 -'>='=92 -'+'=93 -'-'=94 -'*'=95 -'/'=96 -'%'=97 -'{'=98 -'}'=99 -'??'=100 -']'=104 -')'=106 -'metadata'=112 -'group'=120 -'score'=121 -'key'=122 -'join'=130 -'USING'=131 -'as'=158 -'info'=165 +'user_agent'=22 +'from'=23 +'ts'=24 +'fork'=26 +'fuse'=27 +'inline'=28 +'inlinestats'=29 +'lookup'=30 +'mmr'=35 +'mv_expand'=36 +'drop'=37 +'keep'=38 +'promql'=40 +'rename'=41 +'set'=42 +'show'=43 +'|'=58 +'and'=62 +'asc'=63 +'='=64 +'by'=65 +'::'=66 +':'=67 +';'=68 +','=69 +'desc'=70 +'.'=71 +'false'=72 +'first'=73 +'in'=74 +'is'=75 +'last'=76 +'like'=77 +'not'=78 +'null'=79 +'nulls'=80 +'on'=81 +'or'=82 +'?'=83 +'rlike'=84 +'true'=85 +'with'=86 +'=='=87 +'=~'=88 +'!='=89 +'<'=90 +'<='=91 +'>'=92 +'>='=93 +'+'=94 +'-'=95 +'*'=96 +'/'=97 +'%'=98 +'{'=99 +'}'=100 +'??'=101 +']'=105 +')'=107 +'metadata'=113 +'group'=121 +'score'=122 +'key'=123 +'join'=131 +'USING'=132 +'as'=159 +'info'=166 diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 index 75cc7ec5131a2..0ede7d409c748 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 @@ -73,6 +73,7 @@ processingCommand | metricsInfoCommand | registeredDomainCommand | tsInfoCommand + | userAgentCommand | mmrCommand // in development | {this.isDevVersion()}? lookupCommand @@ -393,6 +394,10 @@ registeredDomainCommand : REGISTERED_DOMAIN qualifiedName ASSIGN primaryExpression ; +userAgentCommand + : USER_AGENT qualifiedName ASSIGN primaryExpression commandNamedParameters + ; + setCommand : SET setField SEMICOLON ; diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens index 2ff6a1be1bc7d..9ef1824e73446 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens @@ -19,153 +19,154 @@ URI_PARTS=18 METRICS_INFO=19 REGISTERED_DOMAIN=20 TS_INFO=21 -FROM=22 -TS=23 -DEV_EXTERNAL=24 -FORK=25 -FUSE=26 -INLINE=27 -INLINESTATS=28 -JOIN_LOOKUP=29 -DEV_JOIN_FULL=30 -DEV_JOIN_LEFT=31 -DEV_JOIN_RIGHT=32 -DEV_LOOKUP=33 -MMR=34 -MV_EXPAND=35 -DROP=36 -KEEP=37 -DEV_INSIST=38 -PROMQL=39 -RENAME=40 -SET=41 -SHOW=42 -UNKNOWN_CMD=43 -CHANGE_POINT_LINE_COMMENT=44 -CHANGE_POINT_MULTILINE_COMMENT=45 -CHANGE_POINT_WS=46 -ENRICH_POLICY_NAME=47 -ENRICH_LINE_COMMENT=48 -ENRICH_MULTILINE_COMMENT=49 -ENRICH_WS=50 -ENRICH_FIELD_LINE_COMMENT=51 -ENRICH_FIELD_MULTILINE_COMMENT=52 -ENRICH_FIELD_WS=53 -EXPLAIN_WS=54 -EXPLAIN_LINE_COMMENT=55 -EXPLAIN_MULTILINE_COMMENT=56 -PIPE=57 -QUOTED_STRING=58 -INTEGER_LITERAL=59 -DECIMAL_LITERAL=60 -AND=61 -ASC=62 -ASSIGN=63 -BY=64 -CAST_OP=65 -COLON=66 -SEMICOLON=67 -COMMA=68 -DESC=69 -DOT=70 -FALSE=71 -FIRST=72 -IN=73 -IS=74 -LAST=75 -LIKE=76 -NOT=77 -NULL=78 -NULLS=79 -ON=80 -OR=81 -PARAM=82 -RLIKE=83 -TRUE=84 -WITH=85 -EQ=86 -CIEQ=87 -NEQ=88 -LT=89 -LTE=90 -GT=91 -GTE=92 -PLUS=93 -MINUS=94 -ASTERISK=95 -SLASH=96 -PERCENT=97 -LEFT_BRACES=98 -RIGHT_BRACES=99 -DOUBLE_PARAMS=100 -NAMED_OR_POSITIONAL_PARAM=101 -NAMED_OR_POSITIONAL_DOUBLE_PARAMS=102 -OPENING_BRACKET=103 -CLOSING_BRACKET=104 -LP=105 -RP=106 -UNQUOTED_IDENTIFIER=107 -QUOTED_IDENTIFIER=108 -EXPR_LINE_COMMENT=109 -EXPR_MULTILINE_COMMENT=110 -EXPR_WS=111 -METADATA=112 -UNQUOTED_SOURCE=113 -FROM_LINE_COMMENT=114 -FROM_MULTILINE_COMMENT=115 -FROM_WS=116 -FORK_WS=117 -FORK_LINE_COMMENT=118 -FORK_MULTILINE_COMMENT=119 -GROUP=120 -SCORE=121 -KEY=122 -FUSE_LINE_COMMENT=123 -FUSE_MULTILINE_COMMENT=124 -FUSE_WS=125 -INLINE_STATS=126 -INLINE_LINE_COMMENT=127 -INLINE_MULTILINE_COMMENT=128 -INLINE_WS=129 -JOIN=130 -USING=131 -JOIN_LINE_COMMENT=132 -JOIN_MULTILINE_COMMENT=133 -JOIN_WS=134 -LOOKUP_LINE_COMMENT=135 -LOOKUP_MULTILINE_COMMENT=136 -LOOKUP_WS=137 -LOOKUP_FIELD_LINE_COMMENT=138 -LOOKUP_FIELD_MULTILINE_COMMENT=139 -LOOKUP_FIELD_WS=140 -MMR_LIMIT=141 -MMR_LINE_COMMENT=142 -MMR_MULTILINE_COMMENT=143 -MMR_WS=144 -MVEXPAND_LINE_COMMENT=145 -MVEXPAND_MULTILINE_COMMENT=146 -MVEXPAND_WS=147 -ID_PATTERN=148 -PROJECT_LINE_COMMENT=149 -PROJECT_MULTILINE_COMMENT=150 -PROJECT_WS=151 -PROMQL_PARAMS_LINE_COMMENT=152 -PROMQL_PARAMS_MULTILINE_COMMENT=153 -PROMQL_PARAMS_WS=154 -PROMQL_QUERY_COMMENT=155 -PROMQL_SINGLE_QUOTED_STRING=156 -PROMQL_OTHER_QUERY_CONTENT=157 -AS=158 -RENAME_LINE_COMMENT=159 -RENAME_MULTILINE_COMMENT=160 -RENAME_WS=161 -SET_LINE_COMMENT=162 -SET_MULTILINE_COMMENT=163 -SET_WS=164 -INFO=165 -SHOW_LINE_COMMENT=166 -SHOW_MULTILINE_COMMENT=167 -SHOW_WS=168 +USER_AGENT=22 +FROM=23 +TS=24 +DEV_EXTERNAL=25 +FORK=26 +FUSE=27 +INLINE=28 +INLINESTATS=29 +JOIN_LOOKUP=30 +DEV_JOIN_FULL=31 +DEV_JOIN_LEFT=32 +DEV_JOIN_RIGHT=33 +DEV_LOOKUP=34 +MMR=35 +MV_EXPAND=36 +DROP=37 +KEEP=38 +DEV_INSIST=39 +PROMQL=40 +RENAME=41 +SET=42 +SHOW=43 +UNKNOWN_CMD=44 +CHANGE_POINT_LINE_COMMENT=45 +CHANGE_POINT_MULTILINE_COMMENT=46 +CHANGE_POINT_WS=47 +ENRICH_POLICY_NAME=48 +ENRICH_LINE_COMMENT=49 +ENRICH_MULTILINE_COMMENT=50 +ENRICH_WS=51 +ENRICH_FIELD_LINE_COMMENT=52 +ENRICH_FIELD_MULTILINE_COMMENT=53 +ENRICH_FIELD_WS=54 +EXPLAIN_WS=55 +EXPLAIN_LINE_COMMENT=56 +EXPLAIN_MULTILINE_COMMENT=57 +PIPE=58 +QUOTED_STRING=59 +INTEGER_LITERAL=60 +DECIMAL_LITERAL=61 +AND=62 +ASC=63 +ASSIGN=64 +BY=65 +CAST_OP=66 +COLON=67 +SEMICOLON=68 +COMMA=69 +DESC=70 +DOT=71 +FALSE=72 +FIRST=73 +IN=74 +IS=75 +LAST=76 +LIKE=77 +NOT=78 +NULL=79 +NULLS=80 +ON=81 +OR=82 +PARAM=83 +RLIKE=84 +TRUE=85 +WITH=86 +EQ=87 +CIEQ=88 +NEQ=89 +LT=90 +LTE=91 +GT=92 +GTE=93 +PLUS=94 +MINUS=95 +ASTERISK=96 +SLASH=97 +PERCENT=98 +LEFT_BRACES=99 +RIGHT_BRACES=100 +DOUBLE_PARAMS=101 +NAMED_OR_POSITIONAL_PARAM=102 +NAMED_OR_POSITIONAL_DOUBLE_PARAMS=103 +OPENING_BRACKET=104 +CLOSING_BRACKET=105 +LP=106 +RP=107 +UNQUOTED_IDENTIFIER=108 +QUOTED_IDENTIFIER=109 +EXPR_LINE_COMMENT=110 +EXPR_MULTILINE_COMMENT=111 +EXPR_WS=112 +METADATA=113 +UNQUOTED_SOURCE=114 +FROM_LINE_COMMENT=115 +FROM_MULTILINE_COMMENT=116 +FROM_WS=117 +FORK_WS=118 +FORK_LINE_COMMENT=119 +FORK_MULTILINE_COMMENT=120 +GROUP=121 +SCORE=122 +KEY=123 +FUSE_LINE_COMMENT=124 +FUSE_MULTILINE_COMMENT=125 +FUSE_WS=126 +INLINE_STATS=127 +INLINE_LINE_COMMENT=128 +INLINE_MULTILINE_COMMENT=129 +INLINE_WS=130 +JOIN=131 +USING=132 +JOIN_LINE_COMMENT=133 +JOIN_MULTILINE_COMMENT=134 +JOIN_WS=135 +LOOKUP_LINE_COMMENT=136 +LOOKUP_MULTILINE_COMMENT=137 +LOOKUP_WS=138 +LOOKUP_FIELD_LINE_COMMENT=139 +LOOKUP_FIELD_MULTILINE_COMMENT=140 +LOOKUP_FIELD_WS=141 +MMR_LIMIT=142 +MMR_LINE_COMMENT=143 +MMR_MULTILINE_COMMENT=144 +MMR_WS=145 +MVEXPAND_LINE_COMMENT=146 +MVEXPAND_MULTILINE_COMMENT=147 +MVEXPAND_WS=148 +ID_PATTERN=149 +PROJECT_LINE_COMMENT=150 +PROJECT_MULTILINE_COMMENT=151 +PROJECT_WS=152 +PROMQL_PARAMS_LINE_COMMENT=153 +PROMQL_PARAMS_MULTILINE_COMMENT=154 +PROMQL_PARAMS_WS=155 +PROMQL_QUERY_COMMENT=156 +PROMQL_SINGLE_QUOTED_STRING=157 +PROMQL_OTHER_QUERY_CONTENT=158 +AS=159 +RENAME_LINE_COMMENT=160 +RENAME_MULTILINE_COMMENT=161 +RENAME_WS=162 +SET_LINE_COMMENT=163 +SET_MULTILINE_COMMENT=164 +SET_WS=165 +INFO=166 +SHOW_LINE_COMMENT=167 +SHOW_MULTILINE_COMMENT=168 +SHOW_WS=169 'change_point'=4 'enrich'=5 'completion'=7 @@ -182,69 +183,70 @@ SHOW_WS=168 'metrics_info'=19 'registered_domain'=20 'ts_info'=21 -'from'=22 -'ts'=23 -'fork'=25 -'fuse'=26 -'inline'=27 -'inlinestats'=28 -'lookup'=29 -'mmr'=34 -'mv_expand'=35 -'drop'=36 -'keep'=37 -'promql'=39 -'rename'=40 -'set'=41 -'show'=42 -'|'=57 -'and'=61 -'asc'=62 -'='=63 -'by'=64 -'::'=65 -':'=66 -';'=67 -','=68 -'desc'=69 -'.'=70 -'false'=71 -'first'=72 -'in'=73 -'is'=74 -'last'=75 -'like'=76 -'not'=77 -'null'=78 -'nulls'=79 -'on'=80 -'or'=81 -'?'=82 -'rlike'=83 -'true'=84 -'with'=85 -'=='=86 -'=~'=87 -'!='=88 -'<'=89 -'<='=90 -'>'=91 -'>='=92 -'+'=93 -'-'=94 -'*'=95 -'/'=96 -'%'=97 -'{'=98 -'}'=99 -'??'=100 -']'=104 -')'=106 -'metadata'=112 -'group'=120 -'score'=121 -'key'=122 -'join'=130 -'USING'=131 -'as'=158 -'info'=165 +'user_agent'=22 +'from'=23 +'ts'=24 +'fork'=26 +'fuse'=27 +'inline'=28 +'inlinestats'=29 +'lookup'=30 +'mmr'=35 +'mv_expand'=36 +'drop'=37 +'keep'=38 +'promql'=40 +'rename'=41 +'set'=42 +'show'=43 +'|'=58 +'and'=62 +'asc'=63 +'='=64 +'by'=65 +'::'=66 +':'=67 +';'=68 +','=69 +'desc'=70 +'.'=71 +'false'=72 +'first'=73 +'in'=74 +'is'=75 +'last'=76 +'like'=77 +'not'=78 +'null'=79 +'nulls'=80 +'on'=81 +'or'=82 +'?'=83 +'rlike'=84 +'true'=85 +'with'=86 +'=='=87 +'=~'=88 +'!='=89 +'<'=90 +'<='=91 +'>'=92 +'>='=93 +'+'=94 +'-'=95 +'*'=96 +'/'=97 +'%'=98 +'{'=99 +'}'=100 +'??'=101 +']'=105 +')'=107 +'metadata'=113 +'group'=121 +'score'=122 +'key'=123 +'join'=131 +'USING'=132 +'as'=159 +'info'=166 diff --git a/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 b/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 index 4de56d13edc2e..efd9e4819a64a 100644 --- a/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 +++ b/x-pack/plugin/esql/src/main/antlr/lexer/Expression.g4 @@ -24,6 +24,7 @@ URI_PARTS: 'uri_parts' -> pushMode(EXPRESSION_MODE); METRICS_INFO : 'metrics_info' -> pushMode(EXPRESSION_MODE); REGISTERED_DOMAIN: 'registered_domain' -> pushMode(EXPRESSION_MODE); TS_INFO : 'ts_info' -> pushMode(EXPRESSION_MODE); +USER_AGENT : 'user_agent' -> pushMode(EXPRESSION_MODE); mode EXPRESSION_MODE; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java index a200ff64277b1..16b64d6a2d9e5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java @@ -2404,6 +2404,11 @@ public enum Cap { PROPAGATE_EMPTY_RELATION_PAST_JOINS, + /** + * Supports the {@code USER_AGENT} command. + */ + USER_AGENT_COMMAND, + // Last capability should still have a comma for fewer merge conflicts when adding new ones :) // This comment prevents the semicolon from being on the previous capability when Spotless formats the file. ; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java index 19709e6f20518..4dc37fd8697c2 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/approximation/Approximation.java @@ -61,6 +61,7 @@ import org.elasticsearch.xpack.esql.plan.logical.TopN; import org.elasticsearch.xpack.esql.plan.logical.TopNBy; import org.elasticsearch.xpack.esql.plan.logical.UriParts; +import org.elasticsearch.xpack.esql.plan.logical.UserAgent; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; import org.elasticsearch.xpack.esql.plan.logical.local.CopyingLocalSupplier; @@ -156,7 +157,8 @@ public record QueryProperties(boolean hasGrouping, boolean canDecreaseRowCount, Row.class, Sample.class, SampledAggregate.class, - UriParts.class + UriParts.class, + UserAgent.class ); /** diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/CompoundOutputEvaluator.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/CompoundOutputEvaluator.java index 7abd3d63c3609..792988e6bc211 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/CompoundOutputEvaluator.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/CompoundOutputEvaluator.java @@ -116,7 +116,7 @@ public String toString() { /** * The base class for output fields collectors. - * Concrete collectors would implement interfaces that correspond to their corresponding evaluating function, in addition to + * Concrete collectors may implement interfaces that correspond to their corresponding evaluating function, in addition to * extending this class. */ public abstract static class OutputFieldsCollector { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/UserAgentFunctionBridge.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/UserAgentFunctionBridge.java new file mode 100644 index 0000000000000..6fcac40b8e9ab --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/evaluator/command/UserAgentFunctionBridge.java @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.evaluator.command; + +import org.elasticsearch.useragent.api.Details; +import org.elasticsearch.useragent.api.UserAgentParsedInfo; +import org.elasticsearch.useragent.api.UserAgentParser; + +import java.util.SequencedCollection; +import java.util.SequencedMap; +import java.util.function.BiConsumer; + +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.DEVICE_NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.DEVICE_TYPE; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_FULL; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_VERSION; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.VERSION; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.NOOP_STRING_COLLECTOR; +import static org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator.stringValueCollector; + +/** + * Bridge for the USER_AGENT command that parses user-agent strings into structured fields. + */ +public final class UserAgentFunctionBridge { + + public static SequencedMap> getAllOutputFields() { + return UserAgentParsedInfo.getUserAgentInfoFields(); + } + + public static final class UserAgentCollectorImpl extends CompoundOutputEvaluator.OutputFieldsCollector { + private final UserAgentParser parser; + private final boolean extractDeviceType; + + private final BiConsumer name; + private final BiConsumer version; + private final BiConsumer osName; + private final BiConsumer osVersion; + private final BiConsumer osFull; + private final BiConsumer deviceName; + private final BiConsumer deviceType; + + public UserAgentCollectorImpl(SequencedCollection outputFields, UserAgentParser parser, boolean extractDeviceType) { + super(outputFields.size()); + this.parser = parser; + this.extractDeviceType = extractDeviceType; + + BiConsumer name = NOOP_STRING_COLLECTOR; + BiConsumer version = NOOP_STRING_COLLECTOR; + BiConsumer osName = NOOP_STRING_COLLECTOR; + BiConsumer osVersion = NOOP_STRING_COLLECTOR; + BiConsumer osFull = NOOP_STRING_COLLECTOR; + BiConsumer deviceName = NOOP_STRING_COLLECTOR; + BiConsumer deviceType = NOOP_STRING_COLLECTOR; + + int index = 0; + for (String outputField : outputFields) { + switch (outputField) { + case NAME -> name = stringValueCollector(index); + case VERSION -> version = stringValueCollector(index); + case OS_NAME -> osName = stringValueCollector(index); + case OS_VERSION -> osVersion = stringValueCollector(index); + case OS_FULL -> osFull = stringValueCollector(index); + case DEVICE_NAME -> deviceName = stringValueCollector(index); + case DEVICE_TYPE -> deviceType = stringValueCollector(index); + default -> { + // unknown field — corresponding block will be filled with nulls + } + } + index++; + } + + this.name = name; + this.version = version; + this.osName = osName; + this.osVersion = osVersion; + this.osFull = osFull; + this.deviceName = deviceName; + this.deviceType = deviceType; + } + + @Override + protected void evaluate(String input) { + Details details = parser.parseUserAgentInfo(input, extractDeviceType); + name.accept(rowOutput, details.name()); + version.accept(rowOutput, details.version()); + if (details.os() != null) { + osName.accept(rowOutput, details.os().name()); + osVersion.accept(rowOutput, details.os().version()); + } + osFull.accept(rowOutput, details.osFull()); + if (details.device() != null) { + deviceName.accept(rowOutput, details.device().name()); + } + boolean parsed = details.name() != null || details.os() != null || details.device() != null; + deviceType.accept(rowOutput, parsed ? details.deviceType() : null); + } + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp index 2a3b7314d208a..8797b154f2b75 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp @@ -21,6 +21,7 @@ null 'metrics_info' 'registered_domain' 'ts_info' +'user_agent' 'from' 'ts' null @@ -192,6 +193,7 @@ URI_PARTS METRICS_INFO REGISTERED_DOMAIN TS_INFO +USER_AGENT FROM TS DEV_EXTERNAL @@ -362,6 +364,7 @@ URI_PARTS METRICS_INFO REGISTERED_DOMAIN TS_INFO +USER_AGENT FROM TS DEV_EXTERNAL @@ -715,4 +718,4 @@ SET_MODE SHOW_MODE atn: -[4, 0, 168, 2546, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 2, 342, 7, 342, 2, 343, 7, 343, 2, 344, 7, 344, 2, 345, 7, 345, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 717, 8, 0, 10, 0, 12, 0, 720, 9, 0, 1, 0, 3, 0, 723, 8, 0, 1, 0, 3, 0, 726, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 735, 8, 1, 10, 1, 12, 1, 738, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 746, 8, 2, 11, 2, 12, 2, 747, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 4, 42, 1119, 8, 42, 11, 42, 12, 42, 1120, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 4, 61, 1204, 8, 61, 11, 61, 12, 61, 1205, 1, 61, 1, 61, 3, 61, 1210, 8, 61, 1, 61, 4, 61, 1213, 8, 61, 11, 61, 12, 61, 1214, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 3, 94, 1347, 8, 94, 1, 94, 4, 94, 1350, 8, 94, 11, 94, 12, 94, 1351, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 3, 97, 1361, 8, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 3, 99, 1368, 8, 99, 1, 100, 1, 100, 1, 100, 5, 100, 1373, 8, 100, 10, 100, 12, 100, 1376, 9, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 5, 100, 1384, 8, 100, 10, 100, 12, 100, 1387, 9, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 3, 100, 1394, 8, 100, 1, 100, 3, 100, 1397, 8, 100, 3, 100, 1399, 8, 100, 1, 101, 4, 101, 1402, 8, 101, 11, 101, 12, 101, 1403, 1, 102, 4, 102, 1407, 8, 102, 11, 102, 12, 102, 1408, 1, 102, 1, 102, 5, 102, 1413, 8, 102, 10, 102, 12, 102, 1416, 9, 102, 1, 102, 1, 102, 4, 102, 1420, 8, 102, 11, 102, 12, 102, 1421, 1, 102, 4, 102, 1425, 8, 102, 11, 102, 12, 102, 1426, 1, 102, 1, 102, 5, 102, 1431, 8, 102, 10, 102, 12, 102, 1434, 9, 102, 3, 102, 1436, 8, 102, 1, 102, 1, 102, 1, 102, 1, 102, 4, 102, 1442, 8, 102, 11, 102, 12, 102, 1443, 1, 102, 1, 102, 3, 102, 1448, 8, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 3, 144, 1589, 8, 144, 1, 144, 5, 144, 1592, 8, 144, 10, 144, 12, 144, 1595, 9, 144, 1, 144, 1, 144, 4, 144, 1599, 8, 144, 11, 144, 12, 144, 1600, 3, 144, 1603, 8, 144, 1, 145, 1, 145, 1, 145, 3, 145, 1608, 8, 145, 1, 145, 5, 145, 1611, 8, 145, 10, 145, 12, 145, 1614, 9, 145, 1, 145, 1, 145, 4, 145, 1618, 8, 145, 11, 145, 12, 145, 1619, 3, 145, 1622, 8, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 5, 150, 1646, 8, 150, 10, 150, 12, 150, 1649, 9, 150, 1, 150, 1, 150, 3, 150, 1653, 8, 150, 1, 150, 4, 150, 1656, 8, 150, 11, 150, 12, 150, 1657, 3, 150, 1660, 8, 150, 1, 151, 1, 151, 4, 151, 1664, 8, 151, 11, 151, 12, 151, 1665, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 3, 167, 1742, 8, 167, 1, 168, 4, 168, 1745, 8, 168, 11, 168, 12, 168, 1746, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 3, 275, 2220, 8, 275, 1, 276, 1, 276, 3, 276, 2224, 8, 276, 1, 276, 5, 276, 2227, 8, 276, 10, 276, 12, 276, 2230, 9, 276, 1, 276, 1, 276, 3, 276, 2234, 8, 276, 1, 276, 4, 276, 2237, 8, 276, 11, 276, 12, 276, 2238, 3, 276, 2241, 8, 276, 1, 277, 1, 277, 4, 277, 2245, 8, 277, 11, 277, 12, 277, 2246, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 5, 297, 2334, 8, 297, 10, 297, 12, 297, 2337, 9, 297, 1, 297, 3, 297, 2340, 8, 297, 1, 297, 3, 297, 2343, 8, 297, 1, 298, 1, 298, 1, 298, 1, 298, 5, 298, 2349, 8, 298, 10, 298, 12, 298, 2352, 9, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 1, 312, 1, 312, 1, 312, 1, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 314, 1, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 318, 1, 318, 1, 319, 1, 319, 1, 319, 1, 319, 1, 319, 1, 320, 1, 320, 1, 320, 1, 320, 1, 321, 1, 321, 1, 321, 1, 321, 1, 322, 1, 322, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 1, 324, 1, 325, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 1, 326, 1, 327, 1, 327, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 332, 1, 332, 1, 332, 1, 332, 1, 333, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 1, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 1, 336, 1, 336, 1, 336, 1, 337, 1, 337, 1, 337, 1, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 340, 1, 340, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 343, 1, 343, 1, 343, 1, 343, 1, 344, 1, 344, 1, 344, 1, 344, 1, 345, 1, 345, 1, 345, 1, 345, 2, 736, 1385, 0, 346, 20, 1, 22, 2, 24, 3, 26, 4, 28, 5, 30, 6, 32, 7, 34, 8, 36, 9, 38, 10, 40, 11, 42, 12, 44, 13, 46, 14, 48, 15, 50, 16, 52, 17, 54, 18, 56, 19, 58, 20, 60, 21, 62, 22, 64, 23, 66, 24, 68, 25, 70, 26, 72, 27, 74, 28, 76, 29, 78, 30, 80, 31, 82, 32, 84, 33, 86, 34, 88, 35, 90, 36, 92, 37, 94, 38, 96, 39, 98, 40, 100, 41, 102, 42, 104, 43, 106, 0, 108, 0, 110, 0, 112, 0, 114, 0, 116, 0, 118, 0, 120, 0, 122, 0, 124, 0, 126, 44, 128, 45, 130, 46, 132, 0, 134, 0, 136, 0, 138, 0, 140, 0, 142, 47, 144, 0, 146, 0, 148, 48, 150, 49, 152, 50, 154, 0, 156, 0, 158, 0, 160, 0, 162, 0, 164, 0, 166, 0, 168, 0, 170, 0, 172, 0, 174, 0, 176, 0, 178, 0, 180, 0, 182, 51, 184, 52, 186, 53, 188, 0, 190, 0, 192, 54, 194, 55, 196, 56, 198, 57, 200, 0, 202, 0, 204, 0, 206, 0, 208, 0, 210, 0, 212, 0, 214, 0, 216, 0, 218, 0, 220, 58, 222, 59, 224, 60, 226, 61, 228, 62, 230, 63, 232, 64, 234, 65, 236, 66, 238, 67, 240, 68, 242, 69, 244, 70, 246, 71, 248, 72, 250, 73, 252, 74, 254, 75, 256, 76, 258, 77, 260, 78, 262, 79, 264, 80, 266, 81, 268, 82, 270, 83, 272, 84, 274, 85, 276, 86, 278, 87, 280, 88, 282, 89, 284, 90, 286, 91, 288, 92, 290, 93, 292, 94, 294, 95, 296, 96, 298, 97, 300, 98, 302, 99, 304, 100, 306, 0, 308, 101, 310, 102, 312, 103, 314, 104, 316, 105, 318, 106, 320, 107, 322, 0, 324, 108, 326, 109, 328, 110, 330, 111, 332, 0, 334, 0, 336, 0, 338, 0, 340, 0, 342, 112, 344, 0, 346, 0, 348, 0, 350, 0, 352, 0, 354, 0, 356, 113, 358, 0, 360, 0, 362, 114, 364, 115, 366, 116, 368, 0, 370, 0, 372, 0, 374, 117, 376, 118, 378, 119, 380, 0, 382, 0, 384, 120, 386, 121, 388, 122, 390, 0, 392, 0, 394, 0, 396, 0, 398, 0, 400, 0, 402, 0, 404, 0, 406, 0, 408, 0, 410, 123, 412, 124, 414, 125, 416, 126, 418, 127, 420, 128, 422, 129, 424, 0, 426, 130, 428, 0, 430, 0, 432, 131, 434, 0, 436, 0, 438, 0, 440, 132, 442, 133, 444, 134, 446, 0, 448, 0, 450, 0, 452, 0, 454, 0, 456, 0, 458, 0, 460, 0, 462, 135, 464, 136, 466, 137, 468, 0, 470, 0, 472, 0, 474, 0, 476, 0, 478, 138, 480, 139, 482, 140, 484, 141, 486, 0, 488, 0, 490, 0, 492, 0, 494, 0, 496, 0, 498, 0, 500, 0, 502, 0, 504, 0, 506, 0, 508, 0, 510, 0, 512, 0, 514, 0, 516, 142, 518, 143, 520, 144, 522, 0, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 0, 540, 0, 542, 0, 544, 145, 546, 146, 548, 147, 550, 0, 552, 0, 554, 0, 556, 0, 558, 0, 560, 0, 562, 0, 564, 0, 566, 0, 568, 0, 570, 0, 572, 0, 574, 148, 576, 149, 578, 150, 580, 151, 582, 0, 584, 0, 586, 0, 588, 0, 590, 0, 592, 0, 594, 0, 596, 0, 598, 0, 600, 0, 602, 0, 604, 0, 606, 0, 608, 152, 610, 153, 612, 154, 614, 155, 616, 156, 618, 157, 620, 0, 622, 0, 624, 0, 626, 0, 628, 0, 630, 0, 632, 0, 634, 0, 636, 0, 638, 0, 640, 0, 642, 158, 644, 0, 646, 159, 648, 160, 650, 161, 652, 0, 654, 0, 656, 0, 658, 0, 660, 0, 662, 0, 664, 0, 666, 0, 668, 0, 670, 0, 672, 0, 674, 0, 676, 0, 678, 0, 680, 0, 682, 0, 684, 0, 686, 0, 688, 0, 690, 0, 692, 0, 694, 0, 696, 162, 698, 163, 700, 164, 702, 0, 704, 165, 706, 166, 708, 167, 710, 168, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 39, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 67, 67, 99, 99, 2, 0, 72, 72, 104, 104, 2, 0, 65, 65, 97, 97, 2, 0, 78, 78, 110, 110, 2, 0, 71, 71, 103, 103, 2, 0, 69, 69, 101, 101, 2, 0, 80, 80, 112, 112, 2, 0, 79, 79, 111, 111, 2, 0, 73, 73, 105, 105, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 88, 88, 120, 120, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 68, 68, 100, 100, 2, 0, 83, 83, 115, 115, 2, 0, 86, 86, 118, 118, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 2, 0, 70, 70, 102, 102, 2, 0, 81, 81, 113, 113, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 12, 0, 9, 10, 13, 13, 32, 32, 34, 35, 40, 41, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 12, 0, 9, 10, 13, 13, 32, 32, 34, 34, 40, 41, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 2, 0, 74, 74, 106, 106, 2, 0, 39, 39, 92, 92, 7, 0, 10, 10, 13, 13, 32, 32, 34, 35, 39, 41, 96, 96, 124, 124, 2573, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 3, 154, 1, 0, 0, 0, 3, 156, 1, 0, 0, 0, 3, 158, 1, 0, 0, 0, 3, 160, 1, 0, 0, 0, 3, 162, 1, 0, 0, 0, 3, 164, 1, 0, 0, 0, 3, 166, 1, 0, 0, 0, 3, 168, 1, 0, 0, 0, 3, 170, 1, 0, 0, 0, 3, 172, 1, 0, 0, 0, 3, 174, 1, 0, 0, 0, 3, 176, 1, 0, 0, 0, 3, 178, 1, 0, 0, 0, 3, 180, 1, 0, 0, 0, 3, 182, 1, 0, 0, 0, 3, 184, 1, 0, 0, 0, 3, 186, 1, 0, 0, 0, 4, 188, 1, 0, 0, 0, 4, 190, 1, 0, 0, 0, 4, 192, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 4, 196, 1, 0, 0, 0, 5, 198, 1, 0, 0, 0, 5, 220, 1, 0, 0, 0, 5, 222, 1, 0, 0, 0, 5, 224, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 5, 258, 1, 0, 0, 0, 5, 260, 1, 0, 0, 0, 5, 262, 1, 0, 0, 0, 5, 264, 1, 0, 0, 0, 5, 266, 1, 0, 0, 0, 5, 268, 1, 0, 0, 0, 5, 270, 1, 0, 0, 0, 5, 272, 1, 0, 0, 0, 5, 274, 1, 0, 0, 0, 5, 276, 1, 0, 0, 0, 5, 278, 1, 0, 0, 0, 5, 280, 1, 0, 0, 0, 5, 282, 1, 0, 0, 0, 5, 284, 1, 0, 0, 0, 5, 286, 1, 0, 0, 0, 5, 288, 1, 0, 0, 0, 5, 290, 1, 0, 0, 0, 5, 292, 1, 0, 0, 0, 5, 294, 1, 0, 0, 0, 5, 296, 1, 0, 0, 0, 5, 298, 1, 0, 0, 0, 5, 300, 1, 0, 0, 0, 5, 302, 1, 0, 0, 0, 5, 304, 1, 0, 0, 0, 5, 306, 1, 0, 0, 0, 5, 308, 1, 0, 0, 0, 5, 310, 1, 0, 0, 0, 5, 312, 1, 0, 0, 0, 5, 314, 1, 0, 0, 0, 5, 316, 1, 0, 0, 0, 5, 318, 1, 0, 0, 0, 5, 320, 1, 0, 0, 0, 5, 324, 1, 0, 0, 0, 5, 326, 1, 0, 0, 0, 5, 328, 1, 0, 0, 0, 5, 330, 1, 0, 0, 0, 6, 332, 1, 0, 0, 0, 6, 334, 1, 0, 0, 0, 6, 336, 1, 0, 0, 0, 6, 338, 1, 0, 0, 0, 6, 340, 1, 0, 0, 0, 6, 342, 1, 0, 0, 0, 6, 344, 1, 0, 0, 0, 6, 346, 1, 0, 0, 0, 6, 348, 1, 0, 0, 0, 6, 350, 1, 0, 0, 0, 6, 352, 1, 0, 0, 0, 6, 356, 1, 0, 0, 0, 6, 358, 1, 0, 0, 0, 6, 360, 1, 0, 0, 0, 6, 362, 1, 0, 0, 0, 6, 364, 1, 0, 0, 0, 6, 366, 1, 0, 0, 0, 7, 368, 1, 0, 0, 0, 7, 370, 1, 0, 0, 0, 7, 372, 1, 0, 0, 0, 7, 374, 1, 0, 0, 0, 7, 376, 1, 0, 0, 0, 7, 378, 1, 0, 0, 0, 8, 380, 1, 0, 0, 0, 8, 382, 1, 0, 0, 0, 8, 384, 1, 0, 0, 0, 8, 386, 1, 0, 0, 0, 8, 388, 1, 0, 0, 0, 8, 390, 1, 0, 0, 0, 8, 392, 1, 0, 0, 0, 8, 394, 1, 0, 0, 0, 8, 396, 1, 0, 0, 0, 8, 398, 1, 0, 0, 0, 8, 400, 1, 0, 0, 0, 8, 402, 1, 0, 0, 0, 8, 404, 1, 0, 0, 0, 8, 406, 1, 0, 0, 0, 8, 408, 1, 0, 0, 0, 8, 410, 1, 0, 0, 0, 8, 412, 1, 0, 0, 0, 8, 414, 1, 0, 0, 0, 9, 416, 1, 0, 0, 0, 9, 418, 1, 0, 0, 0, 9, 420, 1, 0, 0, 0, 9, 422, 1, 0, 0, 0, 10, 424, 1, 0, 0, 0, 10, 426, 1, 0, 0, 0, 10, 428, 1, 0, 0, 0, 10, 430, 1, 0, 0, 0, 10, 432, 1, 0, 0, 0, 10, 434, 1, 0, 0, 0, 10, 436, 1, 0, 0, 0, 10, 438, 1, 0, 0, 0, 10, 440, 1, 0, 0, 0, 10, 442, 1, 0, 0, 0, 10, 444, 1, 0, 0, 0, 11, 446, 1, 0, 0, 0, 11, 448, 1, 0, 0, 0, 11, 450, 1, 0, 0, 0, 11, 452, 1, 0, 0, 0, 11, 454, 1, 0, 0, 0, 11, 456, 1, 0, 0, 0, 11, 458, 1, 0, 0, 0, 11, 460, 1, 0, 0, 0, 11, 462, 1, 0, 0, 0, 11, 464, 1, 0, 0, 0, 11, 466, 1, 0, 0, 0, 12, 468, 1, 0, 0, 0, 12, 470, 1, 0, 0, 0, 12, 472, 1, 0, 0, 0, 12, 474, 1, 0, 0, 0, 12, 476, 1, 0, 0, 0, 12, 478, 1, 0, 0, 0, 12, 480, 1, 0, 0, 0, 12, 482, 1, 0, 0, 0, 13, 484, 1, 0, 0, 0, 13, 486, 1, 0, 0, 0, 13, 488, 1, 0, 0, 0, 13, 490, 1, 0, 0, 0, 13, 492, 1, 0, 0, 0, 13, 494, 1, 0, 0, 0, 13, 496, 1, 0, 0, 0, 13, 498, 1, 0, 0, 0, 13, 500, 1, 0, 0, 0, 13, 502, 1, 0, 0, 0, 13, 504, 1, 0, 0, 0, 13, 506, 1, 0, 0, 0, 13, 508, 1, 0, 0, 0, 13, 510, 1, 0, 0, 0, 13, 512, 1, 0, 0, 0, 13, 514, 1, 0, 0, 0, 13, 516, 1, 0, 0, 0, 13, 518, 1, 0, 0, 0, 13, 520, 1, 0, 0, 0, 14, 522, 1, 0, 0, 0, 14, 524, 1, 0, 0, 0, 14, 526, 1, 0, 0, 0, 14, 528, 1, 0, 0, 0, 14, 530, 1, 0, 0, 0, 14, 532, 1, 0, 0, 0, 14, 534, 1, 0, 0, 0, 14, 536, 1, 0, 0, 0, 14, 538, 1, 0, 0, 0, 14, 540, 1, 0, 0, 0, 14, 542, 1, 0, 0, 0, 14, 544, 1, 0, 0, 0, 14, 546, 1, 0, 0, 0, 14, 548, 1, 0, 0, 0, 15, 550, 1, 0, 0, 0, 15, 552, 1, 0, 0, 0, 15, 554, 1, 0, 0, 0, 15, 556, 1, 0, 0, 0, 15, 558, 1, 0, 0, 0, 15, 560, 1, 0, 0, 0, 15, 562, 1, 0, 0, 0, 15, 564, 1, 0, 0, 0, 15, 566, 1, 0, 0, 0, 15, 568, 1, 0, 0, 0, 15, 574, 1, 0, 0, 0, 15, 576, 1, 0, 0, 0, 15, 578, 1, 0, 0, 0, 15, 580, 1, 0, 0, 0, 16, 582, 1, 0, 0, 0, 16, 584, 1, 0, 0, 0, 16, 586, 1, 0, 0, 0, 16, 588, 1, 0, 0, 0, 16, 590, 1, 0, 0, 0, 16, 592, 1, 0, 0, 0, 16, 594, 1, 0, 0, 0, 16, 596, 1, 0, 0, 0, 16, 598, 1, 0, 0, 0, 16, 600, 1, 0, 0, 0, 16, 602, 1, 0, 0, 0, 16, 604, 1, 0, 0, 0, 16, 606, 1, 0, 0, 0, 16, 608, 1, 0, 0, 0, 16, 610, 1, 0, 0, 0, 16, 612, 1, 0, 0, 0, 16, 614, 1, 0, 0, 0, 16, 616, 1, 0, 0, 0, 16, 618, 1, 0, 0, 0, 17, 620, 1, 0, 0, 0, 17, 622, 1, 0, 0, 0, 17, 624, 1, 0, 0, 0, 17, 626, 1, 0, 0, 0, 17, 628, 1, 0, 0, 0, 17, 630, 1, 0, 0, 0, 17, 632, 1, 0, 0, 0, 17, 634, 1, 0, 0, 0, 17, 636, 1, 0, 0, 0, 17, 638, 1, 0, 0, 0, 17, 640, 1, 0, 0, 0, 17, 642, 1, 0, 0, 0, 17, 644, 1, 0, 0, 0, 17, 646, 1, 0, 0, 0, 17, 648, 1, 0, 0, 0, 17, 650, 1, 0, 0, 0, 18, 652, 1, 0, 0, 0, 18, 654, 1, 0, 0, 0, 18, 656, 1, 0, 0, 0, 18, 658, 1, 0, 0, 0, 18, 660, 1, 0, 0, 0, 18, 662, 1, 0, 0, 0, 18, 664, 1, 0, 0, 0, 18, 666, 1, 0, 0, 0, 18, 668, 1, 0, 0, 0, 18, 670, 1, 0, 0, 0, 18, 672, 1, 0, 0, 0, 18, 674, 1, 0, 0, 0, 18, 676, 1, 0, 0, 0, 18, 678, 1, 0, 0, 0, 18, 680, 1, 0, 0, 0, 18, 682, 1, 0, 0, 0, 18, 684, 1, 0, 0, 0, 18, 686, 1, 0, 0, 0, 18, 688, 1, 0, 0, 0, 18, 690, 1, 0, 0, 0, 18, 692, 1, 0, 0, 0, 18, 694, 1, 0, 0, 0, 18, 696, 1, 0, 0, 0, 18, 698, 1, 0, 0, 0, 18, 700, 1, 0, 0, 0, 19, 702, 1, 0, 0, 0, 19, 704, 1, 0, 0, 0, 19, 706, 1, 0, 0, 0, 19, 708, 1, 0, 0, 0, 19, 710, 1, 0, 0, 0, 20, 712, 1, 0, 0, 0, 22, 729, 1, 0, 0, 0, 24, 745, 1, 0, 0, 0, 26, 751, 1, 0, 0, 0, 28, 766, 1, 0, 0, 0, 30, 775, 1, 0, 0, 0, 32, 786, 1, 0, 0, 0, 34, 799, 1, 0, 0, 0, 36, 809, 1, 0, 0, 0, 38, 816, 1, 0, 0, 0, 40, 823, 1, 0, 0, 0, 42, 831, 1, 0, 0, 0, 44, 840, 1, 0, 0, 0, 46, 846, 1, 0, 0, 0, 48, 855, 1, 0, 0, 0, 50, 862, 1, 0, 0, 0, 52, 870, 1, 0, 0, 0, 54, 878, 1, 0, 0, 0, 56, 890, 1, 0, 0, 0, 58, 905, 1, 0, 0, 0, 60, 925, 1, 0, 0, 0, 62, 935, 1, 0, 0, 0, 64, 942, 1, 0, 0, 0, 66, 947, 1, 0, 0, 0, 68, 959, 1, 0, 0, 0, 70, 966, 1, 0, 0, 0, 72, 973, 1, 0, 0, 0, 74, 982, 1, 0, 0, 0, 76, 996, 1, 0, 0, 0, 78, 1005, 1, 0, 0, 0, 80, 1013, 1, 0, 0, 0, 82, 1021, 1, 0, 0, 0, 84, 1030, 1, 0, 0, 0, 86, 1042, 1, 0, 0, 0, 88, 1048, 1, 0, 0, 0, 90, 1060, 1, 0, 0, 0, 92, 1067, 1, 0, 0, 0, 94, 1074, 1, 0, 0, 0, 96, 1086, 1, 0, 0, 0, 98, 1095, 1, 0, 0, 0, 100, 1104, 1, 0, 0, 0, 102, 1110, 1, 0, 0, 0, 104, 1118, 1, 0, 0, 0, 106, 1124, 1, 0, 0, 0, 108, 1129, 1, 0, 0, 0, 110, 1135, 1, 0, 0, 0, 112, 1139, 1, 0, 0, 0, 114, 1143, 1, 0, 0, 0, 116, 1147, 1, 0, 0, 0, 118, 1151, 1, 0, 0, 0, 120, 1155, 1, 0, 0, 0, 122, 1159, 1, 0, 0, 0, 124, 1163, 1, 0, 0, 0, 126, 1167, 1, 0, 0, 0, 128, 1171, 1, 0, 0, 0, 130, 1175, 1, 0, 0, 0, 132, 1179, 1, 0, 0, 0, 134, 1184, 1, 0, 0, 0, 136, 1190, 1, 0, 0, 0, 138, 1195, 1, 0, 0, 0, 140, 1200, 1, 0, 0, 0, 142, 1209, 1, 0, 0, 0, 144, 1216, 1, 0, 0, 0, 146, 1220, 1, 0, 0, 0, 148, 1224, 1, 0, 0, 0, 150, 1228, 1, 0, 0, 0, 152, 1232, 1, 0, 0, 0, 154, 1236, 1, 0, 0, 0, 156, 1242, 1, 0, 0, 0, 158, 1249, 1, 0, 0, 0, 160, 1253, 1, 0, 0, 0, 162, 1257, 1, 0, 0, 0, 164, 1261, 1, 0, 0, 0, 166, 1265, 1, 0, 0, 0, 168, 1269, 1, 0, 0, 0, 170, 1273, 1, 0, 0, 0, 172, 1277, 1, 0, 0, 0, 174, 1281, 1, 0, 0, 0, 176, 1285, 1, 0, 0, 0, 178, 1289, 1, 0, 0, 0, 180, 1293, 1, 0, 0, 0, 182, 1297, 1, 0, 0, 0, 184, 1301, 1, 0, 0, 0, 186, 1305, 1, 0, 0, 0, 188, 1309, 1, 0, 0, 0, 190, 1314, 1, 0, 0, 0, 192, 1319, 1, 0, 0, 0, 194, 1323, 1, 0, 0, 0, 196, 1327, 1, 0, 0, 0, 198, 1331, 1, 0, 0, 0, 200, 1335, 1, 0, 0, 0, 202, 1337, 1, 0, 0, 0, 204, 1339, 1, 0, 0, 0, 206, 1342, 1, 0, 0, 0, 208, 1344, 1, 0, 0, 0, 210, 1353, 1, 0, 0, 0, 212, 1355, 1, 0, 0, 0, 214, 1360, 1, 0, 0, 0, 216, 1362, 1, 0, 0, 0, 218, 1367, 1, 0, 0, 0, 220, 1398, 1, 0, 0, 0, 222, 1401, 1, 0, 0, 0, 224, 1447, 1, 0, 0, 0, 226, 1449, 1, 0, 0, 0, 228, 1453, 1, 0, 0, 0, 230, 1457, 1, 0, 0, 0, 232, 1459, 1, 0, 0, 0, 234, 1462, 1, 0, 0, 0, 236, 1465, 1, 0, 0, 0, 238, 1467, 1, 0, 0, 0, 240, 1469, 1, 0, 0, 0, 242, 1471, 1, 0, 0, 0, 244, 1476, 1, 0, 0, 0, 246, 1478, 1, 0, 0, 0, 248, 1484, 1, 0, 0, 0, 250, 1490, 1, 0, 0, 0, 252, 1493, 1, 0, 0, 0, 254, 1496, 1, 0, 0, 0, 256, 1501, 1, 0, 0, 0, 258, 1506, 1, 0, 0, 0, 260, 1510, 1, 0, 0, 0, 262, 1515, 1, 0, 0, 0, 264, 1521, 1, 0, 0, 0, 266, 1524, 1, 0, 0, 0, 268, 1527, 1, 0, 0, 0, 270, 1529, 1, 0, 0, 0, 272, 1535, 1, 0, 0, 0, 274, 1540, 1, 0, 0, 0, 276, 1545, 1, 0, 0, 0, 278, 1548, 1, 0, 0, 0, 280, 1551, 1, 0, 0, 0, 282, 1554, 1, 0, 0, 0, 284, 1556, 1, 0, 0, 0, 286, 1559, 1, 0, 0, 0, 288, 1561, 1, 0, 0, 0, 290, 1564, 1, 0, 0, 0, 292, 1566, 1, 0, 0, 0, 294, 1568, 1, 0, 0, 0, 296, 1570, 1, 0, 0, 0, 298, 1572, 1, 0, 0, 0, 300, 1574, 1, 0, 0, 0, 302, 1576, 1, 0, 0, 0, 304, 1578, 1, 0, 0, 0, 306, 1581, 1, 0, 0, 0, 308, 1602, 1, 0, 0, 0, 310, 1621, 1, 0, 0, 0, 312, 1623, 1, 0, 0, 0, 314, 1628, 1, 0, 0, 0, 316, 1633, 1, 0, 0, 0, 318, 1638, 1, 0, 0, 0, 320, 1659, 1, 0, 0, 0, 322, 1661, 1, 0, 0, 0, 324, 1669, 1, 0, 0, 0, 326, 1671, 1, 0, 0, 0, 328, 1675, 1, 0, 0, 0, 330, 1679, 1, 0, 0, 0, 332, 1683, 1, 0, 0, 0, 334, 1688, 1, 0, 0, 0, 336, 1692, 1, 0, 0, 0, 338, 1696, 1, 0, 0, 0, 340, 1700, 1, 0, 0, 0, 342, 1704, 1, 0, 0, 0, 344, 1713, 1, 0, 0, 0, 346, 1719, 1, 0, 0, 0, 348, 1723, 1, 0, 0, 0, 350, 1727, 1, 0, 0, 0, 352, 1733, 1, 0, 0, 0, 354, 1741, 1, 0, 0, 0, 356, 1744, 1, 0, 0, 0, 358, 1748, 1, 0, 0, 0, 360, 1752, 1, 0, 0, 0, 362, 1756, 1, 0, 0, 0, 364, 1760, 1, 0, 0, 0, 366, 1764, 1, 0, 0, 0, 368, 1768, 1, 0, 0, 0, 370, 1773, 1, 0, 0, 0, 372, 1779, 1, 0, 0, 0, 374, 1784, 1, 0, 0, 0, 376, 1788, 1, 0, 0, 0, 378, 1792, 1, 0, 0, 0, 380, 1796, 1, 0, 0, 0, 382, 1801, 1, 0, 0, 0, 384, 1807, 1, 0, 0, 0, 386, 1813, 1, 0, 0, 0, 388, 1819, 1, 0, 0, 0, 390, 1823, 1, 0, 0, 0, 392, 1829, 1, 0, 0, 0, 394, 1833, 1, 0, 0, 0, 396, 1837, 1, 0, 0, 0, 398, 1841, 1, 0, 0, 0, 400, 1845, 1, 0, 0, 0, 402, 1849, 1, 0, 0, 0, 404, 1853, 1, 0, 0, 0, 406, 1857, 1, 0, 0, 0, 408, 1861, 1, 0, 0, 0, 410, 1865, 1, 0, 0, 0, 412, 1869, 1, 0, 0, 0, 414, 1873, 1, 0, 0, 0, 416, 1877, 1, 0, 0, 0, 418, 1886, 1, 0, 0, 0, 420, 1890, 1, 0, 0, 0, 422, 1894, 1, 0, 0, 0, 424, 1898, 1, 0, 0, 0, 426, 1903, 1, 0, 0, 0, 428, 1908, 1, 0, 0, 0, 430, 1912, 1, 0, 0, 0, 432, 1918, 1, 0, 0, 0, 434, 1927, 1, 0, 0, 0, 436, 1931, 1, 0, 0, 0, 438, 1935, 1, 0, 0, 0, 440, 1939, 1, 0, 0, 0, 442, 1943, 1, 0, 0, 0, 444, 1947, 1, 0, 0, 0, 446, 1951, 1, 0, 0, 0, 448, 1956, 1, 0, 0, 0, 450, 1962, 1, 0, 0, 0, 452, 1966, 1, 0, 0, 0, 454, 1970, 1, 0, 0, 0, 456, 1974, 1, 0, 0, 0, 458, 1979, 1, 0, 0, 0, 460, 1983, 1, 0, 0, 0, 462, 1987, 1, 0, 0, 0, 464, 1991, 1, 0, 0, 0, 466, 1995, 1, 0, 0, 0, 468, 1999, 1, 0, 0, 0, 470, 2005, 1, 0, 0, 0, 472, 2012, 1, 0, 0, 0, 474, 2016, 1, 0, 0, 0, 476, 2020, 1, 0, 0, 0, 478, 2024, 1, 0, 0, 0, 480, 2028, 1, 0, 0, 0, 482, 2032, 1, 0, 0, 0, 484, 2036, 1, 0, 0, 0, 486, 2041, 1, 0, 0, 0, 488, 2045, 1, 0, 0, 0, 490, 2049, 1, 0, 0, 0, 492, 2053, 1, 0, 0, 0, 494, 2057, 1, 0, 0, 0, 496, 2061, 1, 0, 0, 0, 498, 2065, 1, 0, 0, 0, 500, 2069, 1, 0, 0, 0, 502, 2073, 1, 0, 0, 0, 504, 2077, 1, 0, 0, 0, 506, 2081, 1, 0, 0, 0, 508, 2085, 1, 0, 0, 0, 510, 2089, 1, 0, 0, 0, 512, 2093, 1, 0, 0, 0, 514, 2097, 1, 0, 0, 0, 516, 2101, 1, 0, 0, 0, 518, 2105, 1, 0, 0, 0, 520, 2109, 1, 0, 0, 0, 522, 2113, 1, 0, 0, 0, 524, 2118, 1, 0, 0, 0, 526, 2124, 1, 0, 0, 0, 528, 2128, 1, 0, 0, 0, 530, 2132, 1, 0, 0, 0, 532, 2136, 1, 0, 0, 0, 534, 2140, 1, 0, 0, 0, 536, 2144, 1, 0, 0, 0, 538, 2148, 1, 0, 0, 0, 540, 2152, 1, 0, 0, 0, 542, 2156, 1, 0, 0, 0, 544, 2160, 1, 0, 0, 0, 546, 2164, 1, 0, 0, 0, 548, 2168, 1, 0, 0, 0, 550, 2172, 1, 0, 0, 0, 552, 2177, 1, 0, 0, 0, 554, 2183, 1, 0, 0, 0, 556, 2187, 1, 0, 0, 0, 558, 2191, 1, 0, 0, 0, 560, 2195, 1, 0, 0, 0, 562, 2199, 1, 0, 0, 0, 564, 2203, 1, 0, 0, 0, 566, 2207, 1, 0, 0, 0, 568, 2211, 1, 0, 0, 0, 570, 2219, 1, 0, 0, 0, 572, 2240, 1, 0, 0, 0, 574, 2244, 1, 0, 0, 0, 576, 2248, 1, 0, 0, 0, 578, 2252, 1, 0, 0, 0, 580, 2256, 1, 0, 0, 0, 582, 2260, 1, 0, 0, 0, 584, 2264, 1, 0, 0, 0, 586, 2268, 1, 0, 0, 0, 588, 2272, 1, 0, 0, 0, 590, 2276, 1, 0, 0, 0, 592, 2280, 1, 0, 0, 0, 594, 2284, 1, 0, 0, 0, 596, 2288, 1, 0, 0, 0, 598, 2292, 1, 0, 0, 0, 600, 2296, 1, 0, 0, 0, 602, 2301, 1, 0, 0, 0, 604, 2306, 1, 0, 0, 0, 606, 2312, 1, 0, 0, 0, 608, 2319, 1, 0, 0, 0, 610, 2323, 1, 0, 0, 0, 612, 2327, 1, 0, 0, 0, 614, 2331, 1, 0, 0, 0, 616, 2344, 1, 0, 0, 0, 618, 2355, 1, 0, 0, 0, 620, 2357, 1, 0, 0, 0, 622, 2362, 1, 0, 0, 0, 624, 2368, 1, 0, 0, 0, 626, 2372, 1, 0, 0, 0, 628, 2376, 1, 0, 0, 0, 630, 2380, 1, 0, 0, 0, 632, 2384, 1, 0, 0, 0, 634, 2388, 1, 0, 0, 0, 636, 2392, 1, 0, 0, 0, 638, 2396, 1, 0, 0, 0, 640, 2400, 1, 0, 0, 0, 642, 2404, 1, 0, 0, 0, 644, 2407, 1, 0, 0, 0, 646, 2411, 1, 0, 0, 0, 648, 2415, 1, 0, 0, 0, 650, 2419, 1, 0, 0, 0, 652, 2423, 1, 0, 0, 0, 654, 2427, 1, 0, 0, 0, 656, 2431, 1, 0, 0, 0, 658, 2435, 1, 0, 0, 0, 660, 2440, 1, 0, 0, 0, 662, 2444, 1, 0, 0, 0, 664, 2448, 1, 0, 0, 0, 666, 2452, 1, 0, 0, 0, 668, 2456, 1, 0, 0, 0, 670, 2460, 1, 0, 0, 0, 672, 2464, 1, 0, 0, 0, 674, 2468, 1, 0, 0, 0, 676, 2472, 1, 0, 0, 0, 678, 2476, 1, 0, 0, 0, 680, 2480, 1, 0, 0, 0, 682, 2484, 1, 0, 0, 0, 684, 2488, 1, 0, 0, 0, 686, 2492, 1, 0, 0, 0, 688, 2496, 1, 0, 0, 0, 690, 2500, 1, 0, 0, 0, 692, 2504, 1, 0, 0, 0, 694, 2508, 1, 0, 0, 0, 696, 2512, 1, 0, 0, 0, 698, 2516, 1, 0, 0, 0, 700, 2520, 1, 0, 0, 0, 702, 2524, 1, 0, 0, 0, 704, 2529, 1, 0, 0, 0, 706, 2534, 1, 0, 0, 0, 708, 2538, 1, 0, 0, 0, 710, 2542, 1, 0, 0, 0, 712, 713, 5, 47, 0, 0, 713, 714, 5, 47, 0, 0, 714, 718, 1, 0, 0, 0, 715, 717, 8, 0, 0, 0, 716, 715, 1, 0, 0, 0, 717, 720, 1, 0, 0, 0, 718, 716, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 722, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 721, 723, 5, 13, 0, 0, 722, 721, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 725, 1, 0, 0, 0, 724, 726, 5, 10, 0, 0, 725, 724, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 728, 6, 0, 0, 0, 728, 21, 1, 0, 0, 0, 729, 730, 5, 47, 0, 0, 730, 731, 5, 42, 0, 0, 731, 736, 1, 0, 0, 0, 732, 735, 3, 22, 1, 0, 733, 735, 9, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 733, 1, 0, 0, 0, 735, 738, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 737, 739, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 739, 740, 5, 42, 0, 0, 740, 741, 5, 47, 0, 0, 741, 742, 1, 0, 0, 0, 742, 743, 6, 1, 0, 0, 743, 23, 1, 0, 0, 0, 744, 746, 7, 1, 0, 0, 745, 744, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 6, 2, 0, 0, 750, 25, 1, 0, 0, 0, 751, 752, 7, 2, 0, 0, 752, 753, 7, 3, 0, 0, 753, 754, 7, 4, 0, 0, 754, 755, 7, 5, 0, 0, 755, 756, 7, 6, 0, 0, 756, 757, 7, 7, 0, 0, 757, 758, 5, 95, 0, 0, 758, 759, 7, 8, 0, 0, 759, 760, 7, 9, 0, 0, 760, 761, 7, 10, 0, 0, 761, 762, 7, 5, 0, 0, 762, 763, 7, 11, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 6, 3, 1, 0, 765, 27, 1, 0, 0, 0, 766, 767, 7, 7, 0, 0, 767, 768, 7, 5, 0, 0, 768, 769, 7, 12, 0, 0, 769, 770, 7, 10, 0, 0, 770, 771, 7, 2, 0, 0, 771, 772, 7, 3, 0, 0, 772, 773, 1, 0, 0, 0, 773, 774, 6, 4, 2, 0, 774, 29, 1, 0, 0, 0, 775, 776, 4, 5, 0, 0, 776, 777, 7, 7, 0, 0, 777, 778, 7, 13, 0, 0, 778, 779, 7, 8, 0, 0, 779, 780, 7, 14, 0, 0, 780, 781, 7, 4, 0, 0, 781, 782, 7, 10, 0, 0, 782, 783, 7, 5, 0, 0, 783, 784, 1, 0, 0, 0, 784, 785, 6, 5, 3, 0, 785, 31, 1, 0, 0, 0, 786, 787, 7, 2, 0, 0, 787, 788, 7, 9, 0, 0, 788, 789, 7, 15, 0, 0, 789, 790, 7, 8, 0, 0, 790, 791, 7, 14, 0, 0, 791, 792, 7, 7, 0, 0, 792, 793, 7, 11, 0, 0, 793, 794, 7, 10, 0, 0, 794, 795, 7, 9, 0, 0, 795, 796, 7, 5, 0, 0, 796, 797, 1, 0, 0, 0, 797, 798, 6, 6, 4, 0, 798, 33, 1, 0, 0, 0, 799, 800, 7, 16, 0, 0, 800, 801, 7, 10, 0, 0, 801, 802, 7, 17, 0, 0, 802, 803, 7, 17, 0, 0, 803, 804, 7, 7, 0, 0, 804, 805, 7, 2, 0, 0, 805, 806, 7, 11, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 6, 7, 4, 0, 808, 35, 1, 0, 0, 0, 809, 810, 7, 7, 0, 0, 810, 811, 7, 18, 0, 0, 811, 812, 7, 4, 0, 0, 812, 813, 7, 14, 0, 0, 813, 814, 1, 0, 0, 0, 814, 815, 6, 8, 4, 0, 815, 37, 1, 0, 0, 0, 816, 817, 7, 6, 0, 0, 817, 818, 7, 12, 0, 0, 818, 819, 7, 9, 0, 0, 819, 820, 7, 19, 0, 0, 820, 821, 1, 0, 0, 0, 821, 822, 6, 9, 4, 0, 822, 39, 1, 0, 0, 0, 823, 824, 7, 14, 0, 0, 824, 825, 7, 10, 0, 0, 825, 826, 7, 15, 0, 0, 826, 827, 7, 10, 0, 0, 827, 828, 7, 11, 0, 0, 828, 829, 1, 0, 0, 0, 829, 830, 6, 10, 4, 0, 830, 41, 1, 0, 0, 0, 831, 832, 7, 12, 0, 0, 832, 833, 7, 7, 0, 0, 833, 834, 7, 12, 0, 0, 834, 835, 7, 4, 0, 0, 835, 836, 7, 5, 0, 0, 836, 837, 7, 19, 0, 0, 837, 838, 1, 0, 0, 0, 838, 839, 6, 11, 4, 0, 839, 43, 1, 0, 0, 0, 840, 841, 7, 12, 0, 0, 841, 842, 7, 9, 0, 0, 842, 843, 7, 20, 0, 0, 843, 844, 1, 0, 0, 0, 844, 845, 6, 12, 4, 0, 845, 45, 1, 0, 0, 0, 846, 847, 7, 17, 0, 0, 847, 848, 7, 4, 0, 0, 848, 849, 7, 15, 0, 0, 849, 850, 7, 8, 0, 0, 850, 851, 7, 14, 0, 0, 851, 852, 7, 7, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 6, 13, 4, 0, 854, 47, 1, 0, 0, 0, 855, 856, 7, 17, 0, 0, 856, 857, 7, 9, 0, 0, 857, 858, 7, 12, 0, 0, 858, 859, 7, 11, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 6, 14, 4, 0, 861, 49, 1, 0, 0, 0, 862, 863, 7, 17, 0, 0, 863, 864, 7, 11, 0, 0, 864, 865, 7, 4, 0, 0, 865, 866, 7, 11, 0, 0, 866, 867, 7, 17, 0, 0, 867, 868, 1, 0, 0, 0, 868, 869, 6, 15, 4, 0, 869, 51, 1, 0, 0, 0, 870, 871, 7, 20, 0, 0, 871, 872, 7, 3, 0, 0, 872, 873, 7, 7, 0, 0, 873, 874, 7, 12, 0, 0, 874, 875, 7, 7, 0, 0, 875, 876, 1, 0, 0, 0, 876, 877, 6, 16, 4, 0, 877, 53, 1, 0, 0, 0, 878, 879, 7, 21, 0, 0, 879, 880, 7, 12, 0, 0, 880, 881, 7, 10, 0, 0, 881, 882, 5, 95, 0, 0, 882, 883, 7, 8, 0, 0, 883, 884, 7, 4, 0, 0, 884, 885, 7, 12, 0, 0, 885, 886, 7, 11, 0, 0, 886, 887, 7, 17, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 6, 17, 4, 0, 889, 55, 1, 0, 0, 0, 890, 891, 7, 15, 0, 0, 891, 892, 7, 7, 0, 0, 892, 893, 7, 11, 0, 0, 893, 894, 7, 12, 0, 0, 894, 895, 7, 10, 0, 0, 895, 896, 7, 2, 0, 0, 896, 897, 7, 17, 0, 0, 897, 898, 5, 95, 0, 0, 898, 899, 7, 10, 0, 0, 899, 900, 7, 5, 0, 0, 900, 901, 7, 22, 0, 0, 901, 902, 7, 9, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 6, 18, 4, 0, 904, 57, 1, 0, 0, 0, 905, 906, 7, 12, 0, 0, 906, 907, 7, 7, 0, 0, 907, 908, 7, 6, 0, 0, 908, 909, 7, 10, 0, 0, 909, 910, 7, 17, 0, 0, 910, 911, 7, 11, 0, 0, 911, 912, 7, 7, 0, 0, 912, 913, 7, 12, 0, 0, 913, 914, 7, 7, 0, 0, 914, 915, 7, 16, 0, 0, 915, 916, 5, 95, 0, 0, 916, 917, 7, 16, 0, 0, 917, 918, 7, 9, 0, 0, 918, 919, 7, 15, 0, 0, 919, 920, 7, 4, 0, 0, 920, 921, 7, 10, 0, 0, 921, 922, 7, 5, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 6, 19, 4, 0, 924, 59, 1, 0, 0, 0, 925, 926, 7, 11, 0, 0, 926, 927, 7, 17, 0, 0, 927, 928, 5, 95, 0, 0, 928, 929, 7, 10, 0, 0, 929, 930, 7, 5, 0, 0, 930, 931, 7, 22, 0, 0, 931, 932, 7, 9, 0, 0, 932, 933, 1, 0, 0, 0, 933, 934, 6, 20, 4, 0, 934, 61, 1, 0, 0, 0, 935, 936, 7, 22, 0, 0, 936, 937, 7, 12, 0, 0, 937, 938, 7, 9, 0, 0, 938, 939, 7, 15, 0, 0, 939, 940, 1, 0, 0, 0, 940, 941, 6, 21, 5, 0, 941, 63, 1, 0, 0, 0, 942, 943, 7, 11, 0, 0, 943, 944, 7, 17, 0, 0, 944, 945, 1, 0, 0, 0, 945, 946, 6, 22, 5, 0, 946, 65, 1, 0, 0, 0, 947, 948, 4, 23, 1, 0, 948, 949, 7, 7, 0, 0, 949, 950, 7, 13, 0, 0, 950, 951, 7, 11, 0, 0, 951, 952, 7, 7, 0, 0, 952, 953, 7, 12, 0, 0, 953, 954, 7, 5, 0, 0, 954, 955, 7, 4, 0, 0, 955, 956, 7, 14, 0, 0, 956, 957, 1, 0, 0, 0, 957, 958, 6, 23, 5, 0, 958, 67, 1, 0, 0, 0, 959, 960, 7, 22, 0, 0, 960, 961, 7, 9, 0, 0, 961, 962, 7, 12, 0, 0, 962, 963, 7, 19, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 24, 6, 0, 965, 69, 1, 0, 0, 0, 966, 967, 7, 22, 0, 0, 967, 968, 7, 21, 0, 0, 968, 969, 7, 17, 0, 0, 969, 970, 7, 7, 0, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 25, 7, 0, 972, 71, 1, 0, 0, 0, 973, 974, 7, 10, 0, 0, 974, 975, 7, 5, 0, 0, 975, 976, 7, 14, 0, 0, 976, 977, 7, 10, 0, 0, 977, 978, 7, 5, 0, 0, 978, 979, 7, 7, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 26, 8, 0, 981, 73, 1, 0, 0, 0, 982, 983, 7, 10, 0, 0, 983, 984, 7, 5, 0, 0, 984, 985, 7, 14, 0, 0, 985, 986, 7, 10, 0, 0, 986, 987, 7, 5, 0, 0, 987, 988, 7, 7, 0, 0, 988, 989, 7, 17, 0, 0, 989, 990, 7, 11, 0, 0, 990, 991, 7, 4, 0, 0, 991, 992, 7, 11, 0, 0, 992, 993, 7, 17, 0, 0, 993, 994, 1, 0, 0, 0, 994, 995, 6, 27, 4, 0, 995, 75, 1, 0, 0, 0, 996, 997, 7, 14, 0, 0, 997, 998, 7, 9, 0, 0, 998, 999, 7, 9, 0, 0, 999, 1000, 7, 19, 0, 0, 1000, 1001, 7, 21, 0, 0, 1001, 1002, 7, 8, 0, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1004, 6, 28, 9, 0, 1004, 77, 1, 0, 0, 0, 1005, 1006, 4, 29, 2, 0, 1006, 1007, 7, 22, 0, 0, 1007, 1008, 7, 21, 0, 0, 1008, 1009, 7, 14, 0, 0, 1009, 1010, 7, 14, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1012, 6, 29, 9, 0, 1012, 79, 1, 0, 0, 0, 1013, 1014, 4, 30, 3, 0, 1014, 1015, 7, 14, 0, 0, 1015, 1016, 7, 7, 0, 0, 1016, 1017, 7, 22, 0, 0, 1017, 1018, 7, 11, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 6, 30, 9, 0, 1020, 81, 1, 0, 0, 0, 1021, 1022, 4, 31, 4, 0, 1022, 1023, 7, 12, 0, 0, 1023, 1024, 7, 10, 0, 0, 1024, 1025, 7, 6, 0, 0, 1025, 1026, 7, 3, 0, 0, 1026, 1027, 7, 11, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 31, 9, 0, 1029, 83, 1, 0, 0, 0, 1030, 1031, 4, 32, 5, 0, 1031, 1032, 7, 14, 0, 0, 1032, 1033, 7, 9, 0, 0, 1033, 1034, 7, 9, 0, 0, 1034, 1035, 7, 19, 0, 0, 1035, 1036, 7, 21, 0, 0, 1036, 1037, 7, 8, 0, 0, 1037, 1038, 5, 95, 0, 0, 1038, 1039, 5, 128020, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1041, 6, 32, 10, 0, 1041, 85, 1, 0, 0, 0, 1042, 1043, 7, 15, 0, 0, 1043, 1044, 7, 15, 0, 0, 1044, 1045, 7, 12, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1047, 6, 33, 11, 0, 1047, 87, 1, 0, 0, 0, 1048, 1049, 7, 15, 0, 0, 1049, 1050, 7, 18, 0, 0, 1050, 1051, 5, 95, 0, 0, 1051, 1052, 7, 7, 0, 0, 1052, 1053, 7, 13, 0, 0, 1053, 1054, 7, 8, 0, 0, 1054, 1055, 7, 4, 0, 0, 1055, 1056, 7, 5, 0, 0, 1056, 1057, 7, 16, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 6, 34, 12, 0, 1059, 89, 1, 0, 0, 0, 1060, 1061, 7, 16, 0, 0, 1061, 1062, 7, 12, 0, 0, 1062, 1063, 7, 9, 0, 0, 1063, 1064, 7, 8, 0, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1066, 6, 35, 13, 0, 1066, 91, 1, 0, 0, 0, 1067, 1068, 7, 19, 0, 0, 1068, 1069, 7, 7, 0, 0, 1069, 1070, 7, 7, 0, 0, 1070, 1071, 7, 8, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 6, 36, 13, 0, 1073, 93, 1, 0, 0, 0, 1074, 1075, 4, 37, 6, 0, 1075, 1076, 7, 10, 0, 0, 1076, 1077, 7, 5, 0, 0, 1077, 1078, 7, 17, 0, 0, 1078, 1079, 7, 10, 0, 0, 1079, 1080, 7, 17, 0, 0, 1080, 1081, 7, 11, 0, 0, 1081, 1082, 5, 95, 0, 0, 1082, 1083, 5, 128020, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1085, 6, 37, 13, 0, 1085, 95, 1, 0, 0, 0, 1086, 1087, 7, 8, 0, 0, 1087, 1088, 7, 12, 0, 0, 1088, 1089, 7, 9, 0, 0, 1089, 1090, 7, 15, 0, 0, 1090, 1091, 7, 23, 0, 0, 1091, 1092, 7, 14, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 38, 14, 0, 1094, 97, 1, 0, 0, 0, 1095, 1096, 7, 12, 0, 0, 1096, 1097, 7, 7, 0, 0, 1097, 1098, 7, 5, 0, 0, 1098, 1099, 7, 4, 0, 0, 1099, 1100, 7, 15, 0, 0, 1100, 1101, 7, 7, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 39, 15, 0, 1103, 99, 1, 0, 0, 0, 1104, 1105, 7, 17, 0, 0, 1105, 1106, 7, 7, 0, 0, 1106, 1107, 7, 11, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 40, 16, 0, 1109, 101, 1, 0, 0, 0, 1110, 1111, 7, 17, 0, 0, 1111, 1112, 7, 3, 0, 0, 1112, 1113, 7, 9, 0, 0, 1113, 1114, 7, 20, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 6, 41, 17, 0, 1116, 103, 1, 0, 0, 0, 1117, 1119, 8, 24, 0, 0, 1118, 1117, 1, 0, 0, 0, 1119, 1120, 1, 0, 0, 0, 1120, 1118, 1, 0, 0, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 42, 4, 0, 1123, 105, 1, 0, 0, 0, 1124, 1125, 3, 198, 89, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 6, 43, 18, 0, 1127, 1128, 6, 43, 19, 0, 1128, 107, 1, 0, 0, 0, 1129, 1130, 3, 318, 149, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1132, 6, 44, 20, 0, 1132, 1133, 6, 44, 19, 0, 1133, 1134, 6, 44, 19, 0, 1134, 109, 1, 0, 0, 0, 1135, 1136, 3, 264, 122, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 6, 45, 21, 0, 1138, 111, 1, 0, 0, 0, 1139, 1140, 3, 642, 311, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1142, 6, 46, 22, 0, 1142, 113, 1, 0, 0, 0, 1143, 1144, 3, 244, 112, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1146, 6, 47, 23, 0, 1146, 115, 1, 0, 0, 0, 1147, 1148, 3, 240, 110, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1150, 6, 48, 24, 0, 1150, 117, 1, 0, 0, 0, 1151, 1152, 3, 312, 146, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1154, 6, 49, 25, 0, 1154, 119, 1, 0, 0, 0, 1155, 1156, 3, 314, 147, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1158, 6, 50, 26, 0, 1158, 121, 1, 0, 0, 0, 1159, 1160, 3, 324, 152, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1162, 6, 51, 27, 0, 1162, 123, 1, 0, 0, 0, 1163, 1164, 3, 320, 150, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1166, 6, 52, 28, 0, 1166, 125, 1, 0, 0, 0, 1167, 1168, 3, 20, 0, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1170, 6, 53, 0, 0, 1170, 127, 1, 0, 0, 0, 1171, 1172, 3, 22, 1, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1174, 6, 54, 0, 0, 1174, 129, 1, 0, 0, 0, 1175, 1176, 3, 24, 2, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 6, 55, 0, 0, 1178, 131, 1, 0, 0, 0, 1179, 1180, 3, 198, 89, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1182, 6, 56, 18, 0, 1182, 1183, 6, 56, 19, 0, 1183, 133, 1, 0, 0, 0, 1184, 1185, 3, 318, 149, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 6, 57, 20, 0, 1187, 1188, 6, 57, 19, 0, 1188, 1189, 6, 57, 19, 0, 1189, 135, 1, 0, 0, 0, 1190, 1191, 3, 264, 122, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 6, 58, 21, 0, 1193, 1194, 6, 58, 29, 0, 1194, 137, 1, 0, 0, 0, 1195, 1196, 3, 274, 127, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1198, 6, 59, 30, 0, 1198, 1199, 6, 59, 29, 0, 1199, 139, 1, 0, 0, 0, 1200, 1201, 8, 25, 0, 0, 1201, 141, 1, 0, 0, 0, 1202, 1204, 3, 140, 60, 0, 1203, 1202, 1, 0, 0, 0, 1204, 1205, 1, 0, 0, 0, 1205, 1203, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 3, 236, 108, 0, 1208, 1210, 1, 0, 0, 0, 1209, 1203, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1212, 1, 0, 0, 0, 1211, 1213, 3, 140, 60, 0, 1212, 1211, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1212, 1, 0, 0, 0, 1214, 1215, 1, 0, 0, 0, 1215, 143, 1, 0, 0, 0, 1216, 1217, 3, 142, 61, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 62, 31, 0, 1219, 145, 1, 0, 0, 0, 1220, 1221, 3, 220, 100, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 6, 63, 32, 0, 1223, 147, 1, 0, 0, 0, 1224, 1225, 3, 20, 0, 0, 1225, 1226, 1, 0, 0, 0, 1226, 1227, 6, 64, 0, 0, 1227, 149, 1, 0, 0, 0, 1228, 1229, 3, 22, 1, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 6, 65, 0, 0, 1231, 151, 1, 0, 0, 0, 1232, 1233, 3, 24, 2, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1235, 6, 66, 0, 0, 1235, 153, 1, 0, 0, 0, 1236, 1237, 3, 198, 89, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1239, 6, 67, 18, 0, 1239, 1240, 6, 67, 19, 0, 1240, 1241, 6, 67, 19, 0, 1241, 155, 1, 0, 0, 0, 1242, 1243, 3, 318, 149, 0, 1243, 1244, 1, 0, 0, 0, 1244, 1245, 6, 68, 20, 0, 1245, 1246, 6, 68, 19, 0, 1246, 1247, 6, 68, 19, 0, 1247, 1248, 6, 68, 19, 0, 1248, 157, 1, 0, 0, 0, 1249, 1250, 3, 312, 146, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 6, 69, 25, 0, 1252, 159, 1, 0, 0, 0, 1253, 1254, 3, 314, 147, 0, 1254, 1255, 1, 0, 0, 0, 1255, 1256, 6, 70, 26, 0, 1256, 161, 1, 0, 0, 0, 1257, 1258, 3, 230, 105, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1260, 6, 71, 33, 0, 1260, 163, 1, 0, 0, 0, 1261, 1262, 3, 240, 110, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 6, 72, 24, 0, 1264, 165, 1, 0, 0, 0, 1265, 1266, 3, 244, 112, 0, 1266, 1267, 1, 0, 0, 0, 1267, 1268, 6, 73, 23, 0, 1268, 167, 1, 0, 0, 0, 1269, 1270, 3, 274, 127, 0, 1270, 1271, 1, 0, 0, 0, 1271, 1272, 6, 74, 30, 0, 1272, 169, 1, 0, 0, 0, 1273, 1274, 3, 574, 277, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 6, 75, 34, 0, 1276, 171, 1, 0, 0, 0, 1277, 1278, 3, 324, 152, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1280, 6, 76, 27, 0, 1280, 173, 1, 0, 0, 0, 1281, 1282, 3, 268, 124, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 77, 35, 0, 1284, 175, 1, 0, 0, 0, 1285, 1286, 3, 308, 144, 0, 1286, 1287, 1, 0, 0, 0, 1287, 1288, 6, 78, 36, 0, 1288, 177, 1, 0, 0, 0, 1289, 1290, 3, 304, 142, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1292, 6, 79, 37, 0, 1292, 179, 1, 0, 0, 0, 1293, 1294, 3, 310, 145, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1296, 6, 80, 38, 0, 1296, 181, 1, 0, 0, 0, 1297, 1298, 3, 20, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1300, 6, 81, 0, 0, 1300, 183, 1, 0, 0, 0, 1301, 1302, 3, 22, 1, 0, 1302, 1303, 1, 0, 0, 0, 1303, 1304, 6, 82, 0, 0, 1304, 185, 1, 0, 0, 0, 1305, 1306, 3, 24, 2, 0, 1306, 1307, 1, 0, 0, 0, 1307, 1308, 6, 83, 0, 0, 1308, 187, 1, 0, 0, 0, 1309, 1310, 3, 316, 148, 0, 1310, 1311, 1, 0, 0, 0, 1311, 1312, 6, 84, 39, 0, 1312, 1313, 6, 84, 40, 0, 1313, 189, 1, 0, 0, 0, 1314, 1315, 3, 198, 89, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 6, 85, 18, 0, 1317, 1318, 6, 85, 19, 0, 1318, 191, 1, 0, 0, 0, 1319, 1320, 3, 24, 2, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1322, 6, 86, 0, 0, 1322, 193, 1, 0, 0, 0, 1323, 1324, 3, 20, 0, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1326, 6, 87, 0, 0, 1326, 195, 1, 0, 0, 0, 1327, 1328, 3, 22, 1, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1330, 6, 88, 0, 0, 1330, 197, 1, 0, 0, 0, 1331, 1332, 5, 124, 0, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 6, 89, 19, 0, 1334, 199, 1, 0, 0, 0, 1335, 1336, 7, 26, 0, 0, 1336, 201, 1, 0, 0, 0, 1337, 1338, 7, 27, 0, 0, 1338, 203, 1, 0, 0, 0, 1339, 1340, 5, 92, 0, 0, 1340, 1341, 7, 28, 0, 0, 1341, 205, 1, 0, 0, 0, 1342, 1343, 8, 29, 0, 0, 1343, 207, 1, 0, 0, 0, 1344, 1346, 7, 7, 0, 0, 1345, 1347, 7, 30, 0, 0, 1346, 1345, 1, 0, 0, 0, 1346, 1347, 1, 0, 0, 0, 1347, 1349, 1, 0, 0, 0, 1348, 1350, 3, 200, 90, 0, 1349, 1348, 1, 0, 0, 0, 1350, 1351, 1, 0, 0, 0, 1351, 1349, 1, 0, 0, 0, 1351, 1352, 1, 0, 0, 0, 1352, 209, 1, 0, 0, 0, 1353, 1354, 5, 64, 0, 0, 1354, 211, 1, 0, 0, 0, 1355, 1356, 5, 96, 0, 0, 1356, 213, 1, 0, 0, 0, 1357, 1361, 8, 31, 0, 0, 1358, 1359, 5, 96, 0, 0, 1359, 1361, 5, 96, 0, 0, 1360, 1357, 1, 0, 0, 0, 1360, 1358, 1, 0, 0, 0, 1361, 215, 1, 0, 0, 0, 1362, 1363, 5, 95, 0, 0, 1363, 217, 1, 0, 0, 0, 1364, 1368, 3, 202, 91, 0, 1365, 1368, 3, 200, 90, 0, 1366, 1368, 3, 216, 98, 0, 1367, 1364, 1, 0, 0, 0, 1367, 1365, 1, 0, 0, 0, 1367, 1366, 1, 0, 0, 0, 1368, 219, 1, 0, 0, 0, 1369, 1374, 5, 34, 0, 0, 1370, 1373, 3, 204, 92, 0, 1371, 1373, 3, 206, 93, 0, 1372, 1370, 1, 0, 0, 0, 1372, 1371, 1, 0, 0, 0, 1373, 1376, 1, 0, 0, 0, 1374, 1372, 1, 0, 0, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1377, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1377, 1399, 5, 34, 0, 0, 1378, 1379, 5, 34, 0, 0, 1379, 1380, 5, 34, 0, 0, 1380, 1381, 5, 34, 0, 0, 1381, 1385, 1, 0, 0, 0, 1382, 1384, 8, 0, 0, 0, 1383, 1382, 1, 0, 0, 0, 1384, 1387, 1, 0, 0, 0, 1385, 1386, 1, 0, 0, 0, 1385, 1383, 1, 0, 0, 0, 1386, 1388, 1, 0, 0, 0, 1387, 1385, 1, 0, 0, 0, 1388, 1389, 5, 34, 0, 0, 1389, 1390, 5, 34, 0, 0, 1390, 1391, 5, 34, 0, 0, 1391, 1393, 1, 0, 0, 0, 1392, 1394, 5, 34, 0, 0, 1393, 1392, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1396, 1, 0, 0, 0, 1395, 1397, 5, 34, 0, 0, 1396, 1395, 1, 0, 0, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1399, 1, 0, 0, 0, 1398, 1369, 1, 0, 0, 0, 1398, 1378, 1, 0, 0, 0, 1399, 221, 1, 0, 0, 0, 1400, 1402, 3, 200, 90, 0, 1401, 1400, 1, 0, 0, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1401, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1404, 223, 1, 0, 0, 0, 1405, 1407, 3, 200, 90, 0, 1406, 1405, 1, 0, 0, 0, 1407, 1408, 1, 0, 0, 0, 1408, 1406, 1, 0, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1410, 1, 0, 0, 0, 1410, 1414, 3, 244, 112, 0, 1411, 1413, 3, 200, 90, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1416, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1448, 1, 0, 0, 0, 1416, 1414, 1, 0, 0, 0, 1417, 1419, 3, 244, 112, 0, 1418, 1420, 3, 200, 90, 0, 1419, 1418, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1419, 1, 0, 0, 0, 1421, 1422, 1, 0, 0, 0, 1422, 1448, 1, 0, 0, 0, 1423, 1425, 3, 200, 90, 0, 1424, 1423, 1, 0, 0, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1424, 1, 0, 0, 0, 1426, 1427, 1, 0, 0, 0, 1427, 1435, 1, 0, 0, 0, 1428, 1432, 3, 244, 112, 0, 1429, 1431, 3, 200, 90, 0, 1430, 1429, 1, 0, 0, 0, 1431, 1434, 1, 0, 0, 0, 1432, 1430, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1436, 1, 0, 0, 0, 1434, 1432, 1, 0, 0, 0, 1435, 1428, 1, 0, 0, 0, 1435, 1436, 1, 0, 0, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1438, 3, 208, 94, 0, 1438, 1448, 1, 0, 0, 0, 1439, 1441, 3, 244, 112, 0, 1440, 1442, 3, 200, 90, 0, 1441, 1440, 1, 0, 0, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1441, 1, 0, 0, 0, 1443, 1444, 1, 0, 0, 0, 1444, 1445, 1, 0, 0, 0, 1445, 1446, 3, 208, 94, 0, 1446, 1448, 1, 0, 0, 0, 1447, 1406, 1, 0, 0, 0, 1447, 1417, 1, 0, 0, 0, 1447, 1424, 1, 0, 0, 0, 1447, 1439, 1, 0, 0, 0, 1448, 225, 1, 0, 0, 0, 1449, 1450, 7, 4, 0, 0, 1450, 1451, 7, 5, 0, 0, 1451, 1452, 7, 16, 0, 0, 1452, 227, 1, 0, 0, 0, 1453, 1454, 7, 4, 0, 0, 1454, 1455, 7, 17, 0, 0, 1455, 1456, 7, 2, 0, 0, 1456, 229, 1, 0, 0, 0, 1457, 1458, 5, 61, 0, 0, 1458, 231, 1, 0, 0, 0, 1459, 1460, 7, 32, 0, 0, 1460, 1461, 7, 33, 0, 0, 1461, 233, 1, 0, 0, 0, 1462, 1463, 5, 58, 0, 0, 1463, 1464, 5, 58, 0, 0, 1464, 235, 1, 0, 0, 0, 1465, 1466, 5, 58, 0, 0, 1466, 237, 1, 0, 0, 0, 1467, 1468, 5, 59, 0, 0, 1468, 239, 1, 0, 0, 0, 1469, 1470, 5, 44, 0, 0, 1470, 241, 1, 0, 0, 0, 1471, 1472, 7, 16, 0, 0, 1472, 1473, 7, 7, 0, 0, 1473, 1474, 7, 17, 0, 0, 1474, 1475, 7, 2, 0, 0, 1475, 243, 1, 0, 0, 0, 1476, 1477, 5, 46, 0, 0, 1477, 245, 1, 0, 0, 0, 1478, 1479, 7, 22, 0, 0, 1479, 1480, 7, 4, 0, 0, 1480, 1481, 7, 14, 0, 0, 1481, 1482, 7, 17, 0, 0, 1482, 1483, 7, 7, 0, 0, 1483, 247, 1, 0, 0, 0, 1484, 1485, 7, 22, 0, 0, 1485, 1486, 7, 10, 0, 0, 1486, 1487, 7, 12, 0, 0, 1487, 1488, 7, 17, 0, 0, 1488, 1489, 7, 11, 0, 0, 1489, 249, 1, 0, 0, 0, 1490, 1491, 7, 10, 0, 0, 1491, 1492, 7, 5, 0, 0, 1492, 251, 1, 0, 0, 0, 1493, 1494, 7, 10, 0, 0, 1494, 1495, 7, 17, 0, 0, 1495, 253, 1, 0, 0, 0, 1496, 1497, 7, 14, 0, 0, 1497, 1498, 7, 4, 0, 0, 1498, 1499, 7, 17, 0, 0, 1499, 1500, 7, 11, 0, 0, 1500, 255, 1, 0, 0, 0, 1501, 1502, 7, 14, 0, 0, 1502, 1503, 7, 10, 0, 0, 1503, 1504, 7, 19, 0, 0, 1504, 1505, 7, 7, 0, 0, 1505, 257, 1, 0, 0, 0, 1506, 1507, 7, 5, 0, 0, 1507, 1508, 7, 9, 0, 0, 1508, 1509, 7, 11, 0, 0, 1509, 259, 1, 0, 0, 0, 1510, 1511, 7, 5, 0, 0, 1511, 1512, 7, 21, 0, 0, 1512, 1513, 7, 14, 0, 0, 1513, 1514, 7, 14, 0, 0, 1514, 261, 1, 0, 0, 0, 1515, 1516, 7, 5, 0, 0, 1516, 1517, 7, 21, 0, 0, 1517, 1518, 7, 14, 0, 0, 1518, 1519, 7, 14, 0, 0, 1519, 1520, 7, 17, 0, 0, 1520, 263, 1, 0, 0, 0, 1521, 1522, 7, 9, 0, 0, 1522, 1523, 7, 5, 0, 0, 1523, 265, 1, 0, 0, 0, 1524, 1525, 7, 9, 0, 0, 1525, 1526, 7, 12, 0, 0, 1526, 267, 1, 0, 0, 0, 1527, 1528, 5, 63, 0, 0, 1528, 269, 1, 0, 0, 0, 1529, 1530, 7, 12, 0, 0, 1530, 1531, 7, 14, 0, 0, 1531, 1532, 7, 10, 0, 0, 1532, 1533, 7, 19, 0, 0, 1533, 1534, 7, 7, 0, 0, 1534, 271, 1, 0, 0, 0, 1535, 1536, 7, 11, 0, 0, 1536, 1537, 7, 12, 0, 0, 1537, 1538, 7, 21, 0, 0, 1538, 1539, 7, 7, 0, 0, 1539, 273, 1, 0, 0, 0, 1540, 1541, 7, 20, 0, 0, 1541, 1542, 7, 10, 0, 0, 1542, 1543, 7, 11, 0, 0, 1543, 1544, 7, 3, 0, 0, 1544, 275, 1, 0, 0, 0, 1545, 1546, 5, 61, 0, 0, 1546, 1547, 5, 61, 0, 0, 1547, 277, 1, 0, 0, 0, 1548, 1549, 5, 61, 0, 0, 1549, 1550, 5, 126, 0, 0, 1550, 279, 1, 0, 0, 0, 1551, 1552, 5, 33, 0, 0, 1552, 1553, 5, 61, 0, 0, 1553, 281, 1, 0, 0, 0, 1554, 1555, 5, 60, 0, 0, 1555, 283, 1, 0, 0, 0, 1556, 1557, 5, 60, 0, 0, 1557, 1558, 5, 61, 0, 0, 1558, 285, 1, 0, 0, 0, 1559, 1560, 5, 62, 0, 0, 1560, 287, 1, 0, 0, 0, 1561, 1562, 5, 62, 0, 0, 1562, 1563, 5, 61, 0, 0, 1563, 289, 1, 0, 0, 0, 1564, 1565, 5, 43, 0, 0, 1565, 291, 1, 0, 0, 0, 1566, 1567, 5, 45, 0, 0, 1567, 293, 1, 0, 0, 0, 1568, 1569, 5, 42, 0, 0, 1569, 295, 1, 0, 0, 0, 1570, 1571, 5, 47, 0, 0, 1571, 297, 1, 0, 0, 0, 1572, 1573, 5, 37, 0, 0, 1573, 299, 1, 0, 0, 0, 1574, 1575, 5, 123, 0, 0, 1575, 301, 1, 0, 0, 0, 1576, 1577, 5, 125, 0, 0, 1577, 303, 1, 0, 0, 0, 1578, 1579, 5, 63, 0, 0, 1579, 1580, 5, 63, 0, 0, 1580, 305, 1, 0, 0, 0, 1581, 1582, 3, 52, 16, 0, 1582, 1583, 1, 0, 0, 0, 1583, 1584, 6, 143, 41, 0, 1584, 307, 1, 0, 0, 0, 1585, 1588, 3, 268, 124, 0, 1586, 1589, 3, 202, 91, 0, 1587, 1589, 3, 216, 98, 0, 1588, 1586, 1, 0, 0, 0, 1588, 1587, 1, 0, 0, 0, 1589, 1593, 1, 0, 0, 0, 1590, 1592, 3, 218, 99, 0, 1591, 1590, 1, 0, 0, 0, 1592, 1595, 1, 0, 0, 0, 1593, 1591, 1, 0, 0, 0, 1593, 1594, 1, 0, 0, 0, 1594, 1603, 1, 0, 0, 0, 1595, 1593, 1, 0, 0, 0, 1596, 1598, 3, 268, 124, 0, 1597, 1599, 3, 200, 90, 0, 1598, 1597, 1, 0, 0, 0, 1599, 1600, 1, 0, 0, 0, 1600, 1598, 1, 0, 0, 0, 1600, 1601, 1, 0, 0, 0, 1601, 1603, 1, 0, 0, 0, 1602, 1585, 1, 0, 0, 0, 1602, 1596, 1, 0, 0, 0, 1603, 309, 1, 0, 0, 0, 1604, 1607, 3, 304, 142, 0, 1605, 1608, 3, 202, 91, 0, 1606, 1608, 3, 216, 98, 0, 1607, 1605, 1, 0, 0, 0, 1607, 1606, 1, 0, 0, 0, 1608, 1612, 1, 0, 0, 0, 1609, 1611, 3, 218, 99, 0, 1610, 1609, 1, 0, 0, 0, 1611, 1614, 1, 0, 0, 0, 1612, 1610, 1, 0, 0, 0, 1612, 1613, 1, 0, 0, 0, 1613, 1622, 1, 0, 0, 0, 1614, 1612, 1, 0, 0, 0, 1615, 1617, 3, 304, 142, 0, 1616, 1618, 3, 200, 90, 0, 1617, 1616, 1, 0, 0, 0, 1618, 1619, 1, 0, 0, 0, 1619, 1617, 1, 0, 0, 0, 1619, 1620, 1, 0, 0, 0, 1620, 1622, 1, 0, 0, 0, 1621, 1604, 1, 0, 0, 0, 1621, 1615, 1, 0, 0, 0, 1622, 311, 1, 0, 0, 0, 1623, 1624, 5, 91, 0, 0, 1624, 1625, 1, 0, 0, 0, 1625, 1626, 6, 146, 4, 0, 1626, 1627, 6, 146, 4, 0, 1627, 313, 1, 0, 0, 0, 1628, 1629, 5, 93, 0, 0, 1629, 1630, 1, 0, 0, 0, 1630, 1631, 6, 147, 19, 0, 1631, 1632, 6, 147, 19, 0, 1632, 315, 1, 0, 0, 0, 1633, 1634, 5, 40, 0, 0, 1634, 1635, 1, 0, 0, 0, 1635, 1636, 6, 148, 4, 0, 1636, 1637, 6, 148, 4, 0, 1637, 317, 1, 0, 0, 0, 1638, 1639, 5, 41, 0, 0, 1639, 1640, 1, 0, 0, 0, 1640, 1641, 6, 149, 19, 0, 1641, 1642, 6, 149, 19, 0, 1642, 319, 1, 0, 0, 0, 1643, 1647, 3, 202, 91, 0, 1644, 1646, 3, 218, 99, 0, 1645, 1644, 1, 0, 0, 0, 1646, 1649, 1, 0, 0, 0, 1647, 1645, 1, 0, 0, 0, 1647, 1648, 1, 0, 0, 0, 1648, 1660, 1, 0, 0, 0, 1649, 1647, 1, 0, 0, 0, 1650, 1653, 3, 216, 98, 0, 1651, 1653, 3, 210, 95, 0, 1652, 1650, 1, 0, 0, 0, 1652, 1651, 1, 0, 0, 0, 1653, 1655, 1, 0, 0, 0, 1654, 1656, 3, 218, 99, 0, 1655, 1654, 1, 0, 0, 0, 1656, 1657, 1, 0, 0, 0, 1657, 1655, 1, 0, 0, 0, 1657, 1658, 1, 0, 0, 0, 1658, 1660, 1, 0, 0, 0, 1659, 1643, 1, 0, 0, 0, 1659, 1652, 1, 0, 0, 0, 1660, 321, 1, 0, 0, 0, 1661, 1663, 3, 212, 96, 0, 1662, 1664, 3, 214, 97, 0, 1663, 1662, 1, 0, 0, 0, 1664, 1665, 1, 0, 0, 0, 1665, 1663, 1, 0, 0, 0, 1665, 1666, 1, 0, 0, 0, 1666, 1667, 1, 0, 0, 0, 1667, 1668, 3, 212, 96, 0, 1668, 323, 1, 0, 0, 0, 1669, 1670, 3, 322, 151, 0, 1670, 325, 1, 0, 0, 0, 1671, 1672, 3, 20, 0, 0, 1672, 1673, 1, 0, 0, 0, 1673, 1674, 6, 153, 0, 0, 1674, 327, 1, 0, 0, 0, 1675, 1676, 3, 22, 1, 0, 1676, 1677, 1, 0, 0, 0, 1677, 1678, 6, 154, 0, 0, 1678, 329, 1, 0, 0, 0, 1679, 1680, 3, 24, 2, 0, 1680, 1681, 1, 0, 0, 0, 1681, 1682, 6, 155, 0, 0, 1682, 331, 1, 0, 0, 0, 1683, 1684, 3, 198, 89, 0, 1684, 1685, 1, 0, 0, 0, 1685, 1686, 6, 156, 18, 0, 1686, 1687, 6, 156, 19, 0, 1687, 333, 1, 0, 0, 0, 1688, 1689, 3, 236, 108, 0, 1689, 1690, 1, 0, 0, 0, 1690, 1691, 6, 157, 42, 0, 1691, 335, 1, 0, 0, 0, 1692, 1693, 3, 234, 107, 0, 1693, 1694, 1, 0, 0, 0, 1694, 1695, 6, 158, 43, 0, 1695, 337, 1, 0, 0, 0, 1696, 1697, 3, 240, 110, 0, 1697, 1698, 1, 0, 0, 0, 1698, 1699, 6, 159, 24, 0, 1699, 339, 1, 0, 0, 0, 1700, 1701, 3, 230, 105, 0, 1701, 1702, 1, 0, 0, 0, 1702, 1703, 6, 160, 33, 0, 1703, 341, 1, 0, 0, 0, 1704, 1705, 7, 15, 0, 0, 1705, 1706, 7, 7, 0, 0, 1706, 1707, 7, 11, 0, 0, 1707, 1708, 7, 4, 0, 0, 1708, 1709, 7, 16, 0, 0, 1709, 1710, 7, 4, 0, 0, 1710, 1711, 7, 11, 0, 0, 1711, 1712, 7, 4, 0, 0, 1712, 343, 1, 0, 0, 0, 1713, 1714, 3, 274, 127, 0, 1714, 1715, 1, 0, 0, 0, 1715, 1716, 6, 162, 30, 0, 1716, 1717, 6, 162, 19, 0, 1717, 1718, 6, 162, 4, 0, 1718, 345, 1, 0, 0, 0, 1719, 1720, 3, 268, 124, 0, 1720, 1721, 1, 0, 0, 0, 1721, 1722, 6, 163, 35, 0, 1722, 347, 1, 0, 0, 0, 1723, 1724, 3, 308, 144, 0, 1724, 1725, 1, 0, 0, 0, 1725, 1726, 6, 164, 36, 0, 1726, 349, 1, 0, 0, 0, 1727, 1728, 3, 318, 149, 0, 1728, 1729, 1, 0, 0, 0, 1729, 1730, 6, 165, 20, 0, 1730, 1731, 6, 165, 19, 0, 1731, 1732, 6, 165, 19, 0, 1732, 351, 1, 0, 0, 0, 1733, 1734, 3, 316, 148, 0, 1734, 1735, 1, 0, 0, 0, 1735, 1736, 6, 166, 39, 0, 1736, 1737, 6, 166, 40, 0, 1737, 353, 1, 0, 0, 0, 1738, 1742, 8, 34, 0, 0, 1739, 1740, 5, 47, 0, 0, 1740, 1742, 8, 35, 0, 0, 1741, 1738, 1, 0, 0, 0, 1741, 1739, 1, 0, 0, 0, 1742, 355, 1, 0, 0, 0, 1743, 1745, 3, 354, 167, 0, 1744, 1743, 1, 0, 0, 0, 1745, 1746, 1, 0, 0, 0, 1746, 1744, 1, 0, 0, 0, 1746, 1747, 1, 0, 0, 0, 1747, 357, 1, 0, 0, 0, 1748, 1749, 3, 356, 168, 0, 1749, 1750, 1, 0, 0, 0, 1750, 1751, 6, 169, 44, 0, 1751, 359, 1, 0, 0, 0, 1752, 1753, 3, 220, 100, 0, 1753, 1754, 1, 0, 0, 0, 1754, 1755, 6, 170, 32, 0, 1755, 361, 1, 0, 0, 0, 1756, 1757, 3, 20, 0, 0, 1757, 1758, 1, 0, 0, 0, 1758, 1759, 6, 171, 0, 0, 1759, 363, 1, 0, 0, 0, 1760, 1761, 3, 22, 1, 0, 1761, 1762, 1, 0, 0, 0, 1762, 1763, 6, 172, 0, 0, 1763, 365, 1, 0, 0, 0, 1764, 1765, 3, 24, 2, 0, 1765, 1766, 1, 0, 0, 0, 1766, 1767, 6, 173, 0, 0, 1767, 367, 1, 0, 0, 0, 1768, 1769, 3, 316, 148, 0, 1769, 1770, 1, 0, 0, 0, 1770, 1771, 6, 174, 39, 0, 1771, 1772, 6, 174, 40, 0, 1772, 369, 1, 0, 0, 0, 1773, 1774, 3, 318, 149, 0, 1774, 1775, 1, 0, 0, 0, 1775, 1776, 6, 175, 20, 0, 1776, 1777, 6, 175, 19, 0, 1777, 1778, 6, 175, 19, 0, 1778, 371, 1, 0, 0, 0, 1779, 1780, 3, 198, 89, 0, 1780, 1781, 1, 0, 0, 0, 1781, 1782, 6, 176, 18, 0, 1782, 1783, 6, 176, 19, 0, 1783, 373, 1, 0, 0, 0, 1784, 1785, 3, 24, 2, 0, 1785, 1786, 1, 0, 0, 0, 1786, 1787, 6, 177, 0, 0, 1787, 375, 1, 0, 0, 0, 1788, 1789, 3, 20, 0, 0, 1789, 1790, 1, 0, 0, 0, 1790, 1791, 6, 178, 0, 0, 1791, 377, 1, 0, 0, 0, 1792, 1793, 3, 22, 1, 0, 1793, 1794, 1, 0, 0, 0, 1794, 1795, 6, 179, 0, 0, 1795, 379, 1, 0, 0, 0, 1796, 1797, 3, 198, 89, 0, 1797, 1798, 1, 0, 0, 0, 1798, 1799, 6, 180, 18, 0, 1799, 1800, 6, 180, 19, 0, 1800, 381, 1, 0, 0, 0, 1801, 1802, 3, 318, 149, 0, 1802, 1803, 1, 0, 0, 0, 1803, 1804, 6, 181, 20, 0, 1804, 1805, 6, 181, 19, 0, 1805, 1806, 6, 181, 19, 0, 1806, 383, 1, 0, 0, 0, 1807, 1808, 7, 6, 0, 0, 1808, 1809, 7, 12, 0, 0, 1809, 1810, 7, 9, 0, 0, 1810, 1811, 7, 21, 0, 0, 1811, 1812, 7, 8, 0, 0, 1812, 385, 1, 0, 0, 0, 1813, 1814, 7, 17, 0, 0, 1814, 1815, 7, 2, 0, 0, 1815, 1816, 7, 9, 0, 0, 1816, 1817, 7, 12, 0, 0, 1817, 1818, 7, 7, 0, 0, 1818, 387, 1, 0, 0, 0, 1819, 1820, 7, 19, 0, 0, 1820, 1821, 7, 7, 0, 0, 1821, 1822, 7, 33, 0, 0, 1822, 389, 1, 0, 0, 0, 1823, 1824, 3, 274, 127, 0, 1824, 1825, 1, 0, 0, 0, 1825, 1826, 6, 185, 30, 0, 1826, 1827, 6, 185, 19, 0, 1827, 1828, 6, 185, 4, 0, 1828, 391, 1, 0, 0, 0, 1829, 1830, 3, 240, 110, 0, 1830, 1831, 1, 0, 0, 0, 1831, 1832, 6, 186, 24, 0, 1832, 393, 1, 0, 0, 0, 1833, 1834, 3, 244, 112, 0, 1834, 1835, 1, 0, 0, 0, 1835, 1836, 6, 187, 23, 0, 1836, 395, 1, 0, 0, 0, 1837, 1838, 3, 268, 124, 0, 1838, 1839, 1, 0, 0, 0, 1839, 1840, 6, 188, 35, 0, 1840, 397, 1, 0, 0, 0, 1841, 1842, 3, 308, 144, 0, 1842, 1843, 1, 0, 0, 0, 1843, 1844, 6, 189, 36, 0, 1844, 399, 1, 0, 0, 0, 1845, 1846, 3, 304, 142, 0, 1846, 1847, 1, 0, 0, 0, 1847, 1848, 6, 190, 37, 0, 1848, 401, 1, 0, 0, 0, 1849, 1850, 3, 310, 145, 0, 1850, 1851, 1, 0, 0, 0, 1851, 1852, 6, 191, 38, 0, 1852, 403, 1, 0, 0, 0, 1853, 1854, 3, 232, 106, 0, 1854, 1855, 1, 0, 0, 0, 1855, 1856, 6, 192, 45, 0, 1856, 405, 1, 0, 0, 0, 1857, 1858, 3, 324, 152, 0, 1858, 1859, 1, 0, 0, 0, 1859, 1860, 6, 193, 27, 0, 1860, 407, 1, 0, 0, 0, 1861, 1862, 3, 320, 150, 0, 1862, 1863, 1, 0, 0, 0, 1863, 1864, 6, 194, 28, 0, 1864, 409, 1, 0, 0, 0, 1865, 1866, 3, 20, 0, 0, 1866, 1867, 1, 0, 0, 0, 1867, 1868, 6, 195, 0, 0, 1868, 411, 1, 0, 0, 0, 1869, 1870, 3, 22, 1, 0, 1870, 1871, 1, 0, 0, 0, 1871, 1872, 6, 196, 0, 0, 1872, 413, 1, 0, 0, 0, 1873, 1874, 3, 24, 2, 0, 1874, 1875, 1, 0, 0, 0, 1875, 1876, 6, 197, 0, 0, 1876, 415, 1, 0, 0, 0, 1877, 1878, 7, 17, 0, 0, 1878, 1879, 7, 11, 0, 0, 1879, 1880, 7, 4, 0, 0, 1880, 1881, 7, 11, 0, 0, 1881, 1882, 7, 17, 0, 0, 1882, 1883, 1, 0, 0, 0, 1883, 1884, 6, 198, 19, 0, 1884, 1885, 6, 198, 4, 0, 1885, 417, 1, 0, 0, 0, 1886, 1887, 3, 20, 0, 0, 1887, 1888, 1, 0, 0, 0, 1888, 1889, 6, 199, 0, 0, 1889, 419, 1, 0, 0, 0, 1890, 1891, 3, 22, 1, 0, 1891, 1892, 1, 0, 0, 0, 1892, 1893, 6, 200, 0, 0, 1893, 421, 1, 0, 0, 0, 1894, 1895, 3, 24, 2, 0, 1895, 1896, 1, 0, 0, 0, 1896, 1897, 6, 201, 0, 0, 1897, 423, 1, 0, 0, 0, 1898, 1899, 3, 198, 89, 0, 1899, 1900, 1, 0, 0, 0, 1900, 1901, 6, 202, 18, 0, 1901, 1902, 6, 202, 19, 0, 1902, 425, 1, 0, 0, 0, 1903, 1904, 7, 36, 0, 0, 1904, 1905, 7, 9, 0, 0, 1905, 1906, 7, 10, 0, 0, 1906, 1907, 7, 5, 0, 0, 1907, 427, 1, 0, 0, 0, 1908, 1909, 3, 642, 311, 0, 1909, 1910, 1, 0, 0, 0, 1910, 1911, 6, 204, 22, 0, 1911, 429, 1, 0, 0, 0, 1912, 1913, 3, 264, 122, 0, 1913, 1914, 1, 0, 0, 0, 1914, 1915, 6, 205, 21, 0, 1915, 1916, 6, 205, 19, 0, 1916, 1917, 6, 205, 4, 0, 1917, 431, 1, 0, 0, 0, 1918, 1919, 7, 21, 0, 0, 1919, 1920, 7, 17, 0, 0, 1920, 1921, 7, 10, 0, 0, 1921, 1922, 7, 5, 0, 0, 1922, 1923, 7, 6, 0, 0, 1923, 1924, 1, 0, 0, 0, 1924, 1925, 6, 206, 19, 0, 1925, 1926, 6, 206, 4, 0, 1926, 433, 1, 0, 0, 0, 1927, 1928, 3, 356, 168, 0, 1928, 1929, 1, 0, 0, 0, 1929, 1930, 6, 207, 44, 0, 1930, 435, 1, 0, 0, 0, 1931, 1932, 3, 220, 100, 0, 1932, 1933, 1, 0, 0, 0, 1933, 1934, 6, 208, 32, 0, 1934, 437, 1, 0, 0, 0, 1935, 1936, 3, 236, 108, 0, 1936, 1937, 1, 0, 0, 0, 1937, 1938, 6, 209, 42, 0, 1938, 439, 1, 0, 0, 0, 1939, 1940, 3, 20, 0, 0, 1940, 1941, 1, 0, 0, 0, 1941, 1942, 6, 210, 0, 0, 1942, 441, 1, 0, 0, 0, 1943, 1944, 3, 22, 1, 0, 1944, 1945, 1, 0, 0, 0, 1945, 1946, 6, 211, 0, 0, 1946, 443, 1, 0, 0, 0, 1947, 1948, 3, 24, 2, 0, 1948, 1949, 1, 0, 0, 0, 1949, 1950, 6, 212, 0, 0, 1950, 445, 1, 0, 0, 0, 1951, 1952, 3, 198, 89, 0, 1952, 1953, 1, 0, 0, 0, 1953, 1954, 6, 213, 18, 0, 1954, 1955, 6, 213, 19, 0, 1955, 447, 1, 0, 0, 0, 1956, 1957, 3, 318, 149, 0, 1957, 1958, 1, 0, 0, 0, 1958, 1959, 6, 214, 20, 0, 1959, 1960, 6, 214, 19, 0, 1960, 1961, 6, 214, 19, 0, 1961, 449, 1, 0, 0, 0, 1962, 1963, 3, 236, 108, 0, 1963, 1964, 1, 0, 0, 0, 1964, 1965, 6, 215, 42, 0, 1965, 451, 1, 0, 0, 0, 1966, 1967, 3, 240, 110, 0, 1967, 1968, 1, 0, 0, 0, 1968, 1969, 6, 216, 24, 0, 1969, 453, 1, 0, 0, 0, 1970, 1971, 3, 244, 112, 0, 1971, 1972, 1, 0, 0, 0, 1972, 1973, 6, 217, 23, 0, 1973, 455, 1, 0, 0, 0, 1974, 1975, 3, 264, 122, 0, 1975, 1976, 1, 0, 0, 0, 1976, 1977, 6, 218, 21, 0, 1977, 1978, 6, 218, 46, 0, 1978, 457, 1, 0, 0, 0, 1979, 1980, 3, 356, 168, 0, 1980, 1981, 1, 0, 0, 0, 1981, 1982, 6, 219, 44, 0, 1982, 459, 1, 0, 0, 0, 1983, 1984, 3, 220, 100, 0, 1984, 1985, 1, 0, 0, 0, 1985, 1986, 6, 220, 32, 0, 1986, 461, 1, 0, 0, 0, 1987, 1988, 3, 20, 0, 0, 1988, 1989, 1, 0, 0, 0, 1989, 1990, 6, 221, 0, 0, 1990, 463, 1, 0, 0, 0, 1991, 1992, 3, 22, 1, 0, 1992, 1993, 1, 0, 0, 0, 1993, 1994, 6, 222, 0, 0, 1994, 465, 1, 0, 0, 0, 1995, 1996, 3, 24, 2, 0, 1996, 1997, 1, 0, 0, 0, 1997, 1998, 6, 223, 0, 0, 1998, 467, 1, 0, 0, 0, 1999, 2000, 3, 198, 89, 0, 2000, 2001, 1, 0, 0, 0, 2001, 2002, 6, 224, 18, 0, 2002, 2003, 6, 224, 19, 0, 2003, 2004, 6, 224, 19, 0, 2004, 469, 1, 0, 0, 0, 2005, 2006, 3, 318, 149, 0, 2006, 2007, 1, 0, 0, 0, 2007, 2008, 6, 225, 20, 0, 2008, 2009, 6, 225, 19, 0, 2009, 2010, 6, 225, 19, 0, 2010, 2011, 6, 225, 19, 0, 2011, 471, 1, 0, 0, 0, 2012, 2013, 3, 240, 110, 0, 2013, 2014, 1, 0, 0, 0, 2014, 2015, 6, 226, 24, 0, 2015, 473, 1, 0, 0, 0, 2016, 2017, 3, 244, 112, 0, 2017, 2018, 1, 0, 0, 0, 2018, 2019, 6, 227, 23, 0, 2019, 475, 1, 0, 0, 0, 2020, 2021, 3, 574, 277, 0, 2021, 2022, 1, 0, 0, 0, 2022, 2023, 6, 228, 34, 0, 2023, 477, 1, 0, 0, 0, 2024, 2025, 3, 20, 0, 0, 2025, 2026, 1, 0, 0, 0, 2026, 2027, 6, 229, 0, 0, 2027, 479, 1, 0, 0, 0, 2028, 2029, 3, 22, 1, 0, 2029, 2030, 1, 0, 0, 0, 2030, 2031, 6, 230, 0, 0, 2031, 481, 1, 0, 0, 0, 2032, 2033, 3, 24, 2, 0, 2033, 2034, 1, 0, 0, 0, 2034, 2035, 6, 231, 0, 0, 2035, 483, 1, 0, 0, 0, 2036, 2037, 3, 40, 10, 0, 2037, 2038, 1, 0, 0, 0, 2038, 2039, 6, 232, 19, 0, 2039, 2040, 6, 232, 4, 0, 2040, 485, 1, 0, 0, 0, 2041, 2042, 3, 264, 122, 0, 2042, 2043, 1, 0, 0, 0, 2043, 2044, 6, 233, 21, 0, 2044, 487, 1, 0, 0, 0, 2045, 2046, 3, 320, 150, 0, 2046, 2047, 1, 0, 0, 0, 2047, 2048, 6, 234, 28, 0, 2048, 489, 1, 0, 0, 0, 2049, 2050, 3, 312, 146, 0, 2050, 2051, 1, 0, 0, 0, 2051, 2052, 6, 235, 25, 0, 2052, 491, 1, 0, 0, 0, 2053, 2054, 3, 314, 147, 0, 2054, 2055, 1, 0, 0, 0, 2055, 2056, 6, 236, 26, 0, 2056, 493, 1, 0, 0, 0, 2057, 2058, 3, 240, 110, 0, 2058, 2059, 1, 0, 0, 0, 2059, 2060, 6, 237, 24, 0, 2060, 495, 1, 0, 0, 0, 2061, 2062, 3, 290, 135, 0, 2062, 2063, 1, 0, 0, 0, 2063, 2064, 6, 238, 47, 0, 2064, 497, 1, 0, 0, 0, 2065, 2066, 3, 292, 136, 0, 2066, 2067, 1, 0, 0, 0, 2067, 2068, 6, 239, 48, 0, 2068, 499, 1, 0, 0, 0, 2069, 2070, 3, 224, 102, 0, 2070, 2071, 1, 0, 0, 0, 2071, 2072, 6, 240, 49, 0, 2072, 501, 1, 0, 0, 0, 2073, 2074, 3, 222, 101, 0, 2074, 2075, 1, 0, 0, 0, 2075, 2076, 6, 241, 50, 0, 2076, 503, 1, 0, 0, 0, 2077, 2078, 3, 268, 124, 0, 2078, 2079, 1, 0, 0, 0, 2079, 2080, 6, 242, 35, 0, 2080, 505, 1, 0, 0, 0, 2081, 2082, 3, 308, 144, 0, 2082, 2083, 1, 0, 0, 0, 2083, 2084, 6, 243, 36, 0, 2084, 507, 1, 0, 0, 0, 2085, 2086, 3, 316, 148, 0, 2086, 2087, 1, 0, 0, 0, 2087, 2088, 6, 244, 39, 0, 2088, 509, 1, 0, 0, 0, 2089, 2090, 3, 318, 149, 0, 2090, 2091, 1, 0, 0, 0, 2091, 2092, 6, 245, 20, 0, 2092, 511, 1, 0, 0, 0, 2093, 2094, 3, 220, 100, 0, 2094, 2095, 1, 0, 0, 0, 2095, 2096, 6, 246, 32, 0, 2096, 513, 1, 0, 0, 0, 2097, 2098, 3, 234, 107, 0, 2098, 2099, 1, 0, 0, 0, 2099, 2100, 6, 247, 43, 0, 2100, 515, 1, 0, 0, 0, 2101, 2102, 3, 20, 0, 0, 2102, 2103, 1, 0, 0, 0, 2103, 2104, 6, 248, 0, 0, 2104, 517, 1, 0, 0, 0, 2105, 2106, 3, 22, 1, 0, 2106, 2107, 1, 0, 0, 0, 2107, 2108, 6, 249, 0, 0, 2108, 519, 1, 0, 0, 0, 2109, 2110, 3, 24, 2, 0, 2110, 2111, 1, 0, 0, 0, 2111, 2112, 6, 250, 0, 0, 2112, 521, 1, 0, 0, 0, 2113, 2114, 3, 198, 89, 0, 2114, 2115, 1, 0, 0, 0, 2115, 2116, 6, 251, 18, 0, 2116, 2117, 6, 251, 19, 0, 2117, 523, 1, 0, 0, 0, 2118, 2119, 3, 318, 149, 0, 2119, 2120, 1, 0, 0, 0, 2120, 2121, 6, 252, 20, 0, 2121, 2122, 6, 252, 19, 0, 2122, 2123, 6, 252, 19, 0, 2123, 525, 1, 0, 0, 0, 2124, 2125, 3, 312, 146, 0, 2125, 2126, 1, 0, 0, 0, 2126, 2127, 6, 253, 25, 0, 2127, 527, 1, 0, 0, 0, 2128, 2129, 3, 314, 147, 0, 2129, 2130, 1, 0, 0, 0, 2130, 2131, 6, 254, 26, 0, 2131, 529, 1, 0, 0, 0, 2132, 2133, 3, 244, 112, 0, 2133, 2134, 1, 0, 0, 0, 2134, 2135, 6, 255, 23, 0, 2135, 531, 1, 0, 0, 0, 2136, 2137, 3, 268, 124, 0, 2137, 2138, 1, 0, 0, 0, 2138, 2139, 6, 256, 35, 0, 2139, 533, 1, 0, 0, 0, 2140, 2141, 3, 308, 144, 0, 2141, 2142, 1, 0, 0, 0, 2142, 2143, 6, 257, 36, 0, 2143, 535, 1, 0, 0, 0, 2144, 2145, 3, 304, 142, 0, 2145, 2146, 1, 0, 0, 0, 2146, 2147, 6, 258, 37, 0, 2147, 537, 1, 0, 0, 0, 2148, 2149, 3, 310, 145, 0, 2149, 2150, 1, 0, 0, 0, 2150, 2151, 6, 259, 38, 0, 2151, 539, 1, 0, 0, 0, 2152, 2153, 3, 324, 152, 0, 2153, 2154, 1, 0, 0, 0, 2154, 2155, 6, 260, 27, 0, 2155, 541, 1, 0, 0, 0, 2156, 2157, 3, 320, 150, 0, 2157, 2158, 1, 0, 0, 0, 2158, 2159, 6, 261, 28, 0, 2159, 543, 1, 0, 0, 0, 2160, 2161, 3, 20, 0, 0, 2161, 2162, 1, 0, 0, 0, 2162, 2163, 6, 262, 0, 0, 2163, 545, 1, 0, 0, 0, 2164, 2165, 3, 22, 1, 0, 2165, 2166, 1, 0, 0, 0, 2166, 2167, 6, 263, 0, 0, 2167, 547, 1, 0, 0, 0, 2168, 2169, 3, 24, 2, 0, 2169, 2170, 1, 0, 0, 0, 2170, 2171, 6, 264, 0, 0, 2171, 549, 1, 0, 0, 0, 2172, 2173, 3, 198, 89, 0, 2173, 2174, 1, 0, 0, 0, 2174, 2175, 6, 265, 18, 0, 2175, 2176, 6, 265, 19, 0, 2176, 551, 1, 0, 0, 0, 2177, 2178, 3, 318, 149, 0, 2178, 2179, 1, 0, 0, 0, 2179, 2180, 6, 266, 20, 0, 2180, 2181, 6, 266, 19, 0, 2181, 2182, 6, 266, 19, 0, 2182, 553, 1, 0, 0, 0, 2183, 2184, 3, 244, 112, 0, 2184, 2185, 1, 0, 0, 0, 2185, 2186, 6, 267, 23, 0, 2186, 555, 1, 0, 0, 0, 2187, 2188, 3, 312, 146, 0, 2188, 2189, 1, 0, 0, 0, 2189, 2190, 6, 268, 25, 0, 2190, 557, 1, 0, 0, 0, 2191, 2192, 3, 314, 147, 0, 2192, 2193, 1, 0, 0, 0, 2193, 2194, 6, 269, 26, 0, 2194, 559, 1, 0, 0, 0, 2195, 2196, 3, 240, 110, 0, 2196, 2197, 1, 0, 0, 0, 2197, 2198, 6, 270, 24, 0, 2198, 561, 1, 0, 0, 0, 2199, 2200, 3, 268, 124, 0, 2200, 2201, 1, 0, 0, 0, 2201, 2202, 6, 271, 35, 0, 2202, 563, 1, 0, 0, 0, 2203, 2204, 3, 308, 144, 0, 2204, 2205, 1, 0, 0, 0, 2205, 2206, 6, 272, 36, 0, 2206, 565, 1, 0, 0, 0, 2207, 2208, 3, 304, 142, 0, 2208, 2209, 1, 0, 0, 0, 2209, 2210, 6, 273, 37, 0, 2210, 567, 1, 0, 0, 0, 2211, 2212, 3, 310, 145, 0, 2212, 2213, 1, 0, 0, 0, 2213, 2214, 6, 274, 38, 0, 2214, 569, 1, 0, 0, 0, 2215, 2220, 3, 202, 91, 0, 2216, 2220, 3, 200, 90, 0, 2217, 2220, 3, 216, 98, 0, 2218, 2220, 3, 294, 137, 0, 2219, 2215, 1, 0, 0, 0, 2219, 2216, 1, 0, 0, 0, 2219, 2217, 1, 0, 0, 0, 2219, 2218, 1, 0, 0, 0, 2220, 571, 1, 0, 0, 0, 2221, 2224, 3, 202, 91, 0, 2222, 2224, 3, 294, 137, 0, 2223, 2221, 1, 0, 0, 0, 2223, 2222, 1, 0, 0, 0, 2224, 2228, 1, 0, 0, 0, 2225, 2227, 3, 570, 275, 0, 2226, 2225, 1, 0, 0, 0, 2227, 2230, 1, 0, 0, 0, 2228, 2226, 1, 0, 0, 0, 2228, 2229, 1, 0, 0, 0, 2229, 2241, 1, 0, 0, 0, 2230, 2228, 1, 0, 0, 0, 2231, 2234, 3, 216, 98, 0, 2232, 2234, 3, 210, 95, 0, 2233, 2231, 1, 0, 0, 0, 2233, 2232, 1, 0, 0, 0, 2234, 2236, 1, 0, 0, 0, 2235, 2237, 3, 570, 275, 0, 2236, 2235, 1, 0, 0, 0, 2237, 2238, 1, 0, 0, 0, 2238, 2236, 1, 0, 0, 0, 2238, 2239, 1, 0, 0, 0, 2239, 2241, 1, 0, 0, 0, 2240, 2223, 1, 0, 0, 0, 2240, 2233, 1, 0, 0, 0, 2241, 573, 1, 0, 0, 0, 2242, 2245, 3, 572, 276, 0, 2243, 2245, 3, 322, 151, 0, 2244, 2242, 1, 0, 0, 0, 2244, 2243, 1, 0, 0, 0, 2245, 2246, 1, 0, 0, 0, 2246, 2244, 1, 0, 0, 0, 2246, 2247, 1, 0, 0, 0, 2247, 575, 1, 0, 0, 0, 2248, 2249, 3, 20, 0, 0, 2249, 2250, 1, 0, 0, 0, 2250, 2251, 6, 278, 0, 0, 2251, 577, 1, 0, 0, 0, 2252, 2253, 3, 22, 1, 0, 2253, 2254, 1, 0, 0, 0, 2254, 2255, 6, 279, 0, 0, 2255, 579, 1, 0, 0, 0, 2256, 2257, 3, 24, 2, 0, 2257, 2258, 1, 0, 0, 0, 2258, 2259, 6, 280, 0, 0, 2259, 581, 1, 0, 0, 0, 2260, 2261, 3, 320, 150, 0, 2261, 2262, 1, 0, 0, 0, 2262, 2263, 6, 281, 28, 0, 2263, 583, 1, 0, 0, 0, 2264, 2265, 3, 324, 152, 0, 2265, 2266, 1, 0, 0, 0, 2266, 2267, 6, 282, 27, 0, 2267, 585, 1, 0, 0, 0, 2268, 2269, 3, 230, 105, 0, 2269, 2270, 1, 0, 0, 0, 2270, 2271, 6, 283, 33, 0, 2271, 587, 1, 0, 0, 0, 2272, 2273, 3, 308, 144, 0, 2273, 2274, 1, 0, 0, 0, 2274, 2275, 6, 284, 36, 0, 2275, 589, 1, 0, 0, 0, 2276, 2277, 3, 356, 168, 0, 2277, 2278, 1, 0, 0, 0, 2278, 2279, 6, 285, 44, 0, 2279, 591, 1, 0, 0, 0, 2280, 2281, 3, 220, 100, 0, 2281, 2282, 1, 0, 0, 0, 2282, 2283, 6, 286, 32, 0, 2283, 593, 1, 0, 0, 0, 2284, 2285, 3, 236, 108, 0, 2285, 2286, 1, 0, 0, 0, 2286, 2287, 6, 287, 42, 0, 2287, 595, 1, 0, 0, 0, 2288, 2289, 3, 234, 107, 0, 2289, 2290, 1, 0, 0, 0, 2290, 2291, 6, 288, 43, 0, 2291, 597, 1, 0, 0, 0, 2292, 2293, 3, 240, 110, 0, 2293, 2294, 1, 0, 0, 0, 2294, 2295, 6, 289, 24, 0, 2295, 599, 1, 0, 0, 0, 2296, 2297, 3, 198, 89, 0, 2297, 2298, 1, 0, 0, 0, 2298, 2299, 6, 290, 18, 0, 2299, 2300, 6, 290, 19, 0, 2300, 601, 1, 0, 0, 0, 2301, 2302, 3, 316, 148, 0, 2302, 2303, 6, 291, 51, 0, 2303, 2304, 1, 0, 0, 0, 2304, 2305, 6, 291, 39, 0, 2305, 603, 1, 0, 0, 0, 2306, 2307, 5, 41, 0, 0, 2307, 2308, 4, 292, 7, 0, 2308, 2309, 6, 292, 52, 0, 2309, 2310, 1, 0, 0, 0, 2310, 2311, 6, 292, 20, 0, 2311, 605, 1, 0, 0, 0, 2312, 2313, 5, 41, 0, 0, 2313, 2314, 4, 293, 8, 0, 2314, 2315, 6, 293, 53, 0, 2315, 2316, 1, 0, 0, 0, 2316, 2317, 6, 293, 20, 0, 2317, 2318, 6, 293, 19, 0, 2318, 607, 1, 0, 0, 0, 2319, 2320, 3, 20, 0, 0, 2320, 2321, 1, 0, 0, 0, 2321, 2322, 6, 294, 0, 0, 2322, 609, 1, 0, 0, 0, 2323, 2324, 3, 22, 1, 0, 2324, 2325, 1, 0, 0, 0, 2325, 2326, 6, 295, 0, 0, 2326, 611, 1, 0, 0, 0, 2327, 2328, 3, 24, 2, 0, 2328, 2329, 1, 0, 0, 0, 2329, 2330, 6, 296, 0, 0, 2330, 613, 1, 0, 0, 0, 2331, 2335, 5, 35, 0, 0, 2332, 2334, 8, 0, 0, 0, 2333, 2332, 1, 0, 0, 0, 2334, 2337, 1, 0, 0, 0, 2335, 2333, 1, 0, 0, 0, 2335, 2336, 1, 0, 0, 0, 2336, 2339, 1, 0, 0, 0, 2337, 2335, 1, 0, 0, 0, 2338, 2340, 5, 13, 0, 0, 2339, 2338, 1, 0, 0, 0, 2339, 2340, 1, 0, 0, 0, 2340, 2342, 1, 0, 0, 0, 2341, 2343, 5, 10, 0, 0, 2342, 2341, 1, 0, 0, 0, 2342, 2343, 1, 0, 0, 0, 2343, 615, 1, 0, 0, 0, 2344, 2350, 5, 39, 0, 0, 2345, 2346, 5, 92, 0, 0, 2346, 2349, 9, 0, 0, 0, 2347, 2349, 8, 37, 0, 0, 2348, 2345, 1, 0, 0, 0, 2348, 2347, 1, 0, 0, 0, 2349, 2352, 1, 0, 0, 0, 2350, 2348, 1, 0, 0, 0, 2350, 2351, 1, 0, 0, 0, 2351, 2353, 1, 0, 0, 0, 2352, 2350, 1, 0, 0, 0, 2353, 2354, 5, 39, 0, 0, 2354, 617, 1, 0, 0, 0, 2355, 2356, 8, 38, 0, 0, 2356, 619, 1, 0, 0, 0, 2357, 2358, 3, 198, 89, 0, 2358, 2359, 1, 0, 0, 0, 2359, 2360, 6, 300, 18, 0, 2360, 2361, 6, 300, 19, 0, 2361, 621, 1, 0, 0, 0, 2362, 2363, 3, 318, 149, 0, 2363, 2364, 1, 0, 0, 0, 2364, 2365, 6, 301, 20, 0, 2365, 2366, 6, 301, 19, 0, 2366, 2367, 6, 301, 19, 0, 2367, 623, 1, 0, 0, 0, 2368, 2369, 3, 312, 146, 0, 2369, 2370, 1, 0, 0, 0, 2370, 2371, 6, 302, 25, 0, 2371, 625, 1, 0, 0, 0, 2372, 2373, 3, 314, 147, 0, 2373, 2374, 1, 0, 0, 0, 2374, 2375, 6, 303, 26, 0, 2375, 627, 1, 0, 0, 0, 2376, 2377, 3, 230, 105, 0, 2377, 2378, 1, 0, 0, 0, 2378, 2379, 6, 304, 33, 0, 2379, 629, 1, 0, 0, 0, 2380, 2381, 3, 240, 110, 0, 2381, 2382, 1, 0, 0, 0, 2382, 2383, 6, 305, 24, 0, 2383, 631, 1, 0, 0, 0, 2384, 2385, 3, 244, 112, 0, 2385, 2386, 1, 0, 0, 0, 2386, 2387, 6, 306, 23, 0, 2387, 633, 1, 0, 0, 0, 2388, 2389, 3, 268, 124, 0, 2389, 2390, 1, 0, 0, 0, 2390, 2391, 6, 307, 35, 0, 2391, 635, 1, 0, 0, 0, 2392, 2393, 3, 308, 144, 0, 2393, 2394, 1, 0, 0, 0, 2394, 2395, 6, 308, 36, 0, 2395, 637, 1, 0, 0, 0, 2396, 2397, 3, 304, 142, 0, 2397, 2398, 1, 0, 0, 0, 2398, 2399, 6, 309, 37, 0, 2399, 639, 1, 0, 0, 0, 2400, 2401, 3, 310, 145, 0, 2401, 2402, 1, 0, 0, 0, 2402, 2403, 6, 310, 38, 0, 2403, 641, 1, 0, 0, 0, 2404, 2405, 7, 4, 0, 0, 2405, 2406, 7, 17, 0, 0, 2406, 643, 1, 0, 0, 0, 2407, 2408, 3, 574, 277, 0, 2408, 2409, 1, 0, 0, 0, 2409, 2410, 6, 312, 34, 0, 2410, 645, 1, 0, 0, 0, 2411, 2412, 3, 20, 0, 0, 2412, 2413, 1, 0, 0, 0, 2413, 2414, 6, 313, 0, 0, 2414, 647, 1, 0, 0, 0, 2415, 2416, 3, 22, 1, 0, 2416, 2417, 1, 0, 0, 0, 2417, 2418, 6, 314, 0, 0, 2418, 649, 1, 0, 0, 0, 2419, 2420, 3, 24, 2, 0, 2420, 2421, 1, 0, 0, 0, 2421, 2422, 6, 315, 0, 0, 2422, 651, 1, 0, 0, 0, 2423, 2424, 3, 272, 126, 0, 2424, 2425, 1, 0, 0, 0, 2425, 2426, 6, 316, 54, 0, 2426, 653, 1, 0, 0, 0, 2427, 2428, 3, 246, 113, 0, 2428, 2429, 1, 0, 0, 0, 2429, 2430, 6, 317, 55, 0, 2430, 655, 1, 0, 0, 0, 2431, 2432, 3, 260, 120, 0, 2432, 2433, 1, 0, 0, 0, 2433, 2434, 6, 318, 56, 0, 2434, 657, 1, 0, 0, 0, 2435, 2436, 3, 238, 109, 0, 2436, 2437, 1, 0, 0, 0, 2437, 2438, 6, 319, 57, 0, 2438, 2439, 6, 319, 19, 0, 2439, 659, 1, 0, 0, 0, 2440, 2441, 3, 230, 105, 0, 2441, 2442, 1, 0, 0, 0, 2442, 2443, 6, 320, 33, 0, 2443, 661, 1, 0, 0, 0, 2444, 2445, 3, 220, 100, 0, 2445, 2446, 1, 0, 0, 0, 2446, 2447, 6, 321, 32, 0, 2447, 663, 1, 0, 0, 0, 2448, 2449, 3, 320, 150, 0, 2449, 2450, 1, 0, 0, 0, 2450, 2451, 6, 322, 28, 0, 2451, 665, 1, 0, 0, 0, 2452, 2453, 3, 324, 152, 0, 2453, 2454, 1, 0, 0, 0, 2454, 2455, 6, 323, 27, 0, 2455, 667, 1, 0, 0, 0, 2456, 2457, 3, 224, 102, 0, 2457, 2458, 1, 0, 0, 0, 2458, 2459, 6, 324, 49, 0, 2459, 669, 1, 0, 0, 0, 2460, 2461, 3, 222, 101, 0, 2461, 2462, 1, 0, 0, 0, 2462, 2463, 6, 325, 50, 0, 2463, 671, 1, 0, 0, 0, 2464, 2465, 3, 236, 108, 0, 2465, 2466, 1, 0, 0, 0, 2466, 2467, 6, 326, 42, 0, 2467, 673, 1, 0, 0, 0, 2468, 2469, 3, 240, 110, 0, 2469, 2470, 1, 0, 0, 0, 2470, 2471, 6, 327, 24, 0, 2471, 675, 1, 0, 0, 0, 2472, 2473, 3, 244, 112, 0, 2473, 2474, 1, 0, 0, 0, 2474, 2475, 6, 328, 23, 0, 2475, 677, 1, 0, 0, 0, 2476, 2477, 3, 268, 124, 0, 2477, 2478, 1, 0, 0, 0, 2478, 2479, 6, 329, 35, 0, 2479, 679, 1, 0, 0, 0, 2480, 2481, 3, 308, 144, 0, 2481, 2482, 1, 0, 0, 0, 2482, 2483, 6, 330, 36, 0, 2483, 681, 1, 0, 0, 0, 2484, 2485, 3, 300, 140, 0, 2485, 2486, 1, 0, 0, 0, 2486, 2487, 6, 331, 58, 0, 2487, 683, 1, 0, 0, 0, 2488, 2489, 3, 302, 141, 0, 2489, 2490, 1, 0, 0, 0, 2490, 2491, 6, 332, 59, 0, 2491, 685, 1, 0, 0, 0, 2492, 2493, 3, 304, 142, 0, 2493, 2494, 1, 0, 0, 0, 2494, 2495, 6, 333, 37, 0, 2495, 687, 1, 0, 0, 0, 2496, 2497, 3, 310, 145, 0, 2497, 2498, 1, 0, 0, 0, 2498, 2499, 6, 334, 38, 0, 2499, 689, 1, 0, 0, 0, 2500, 2501, 3, 312, 146, 0, 2501, 2502, 1, 0, 0, 0, 2502, 2503, 6, 335, 25, 0, 2503, 691, 1, 0, 0, 0, 2504, 2505, 3, 314, 147, 0, 2505, 2506, 1, 0, 0, 0, 2506, 2507, 6, 336, 26, 0, 2507, 693, 1, 0, 0, 0, 2508, 2509, 3, 574, 277, 0, 2509, 2510, 1, 0, 0, 0, 2510, 2511, 6, 337, 34, 0, 2511, 695, 1, 0, 0, 0, 2512, 2513, 3, 20, 0, 0, 2513, 2514, 1, 0, 0, 0, 2514, 2515, 6, 338, 0, 0, 2515, 697, 1, 0, 0, 0, 2516, 2517, 3, 22, 1, 0, 2517, 2518, 1, 0, 0, 0, 2518, 2519, 6, 339, 0, 0, 2519, 699, 1, 0, 0, 0, 2520, 2521, 3, 24, 2, 0, 2521, 2522, 1, 0, 0, 0, 2522, 2523, 6, 340, 0, 0, 2523, 701, 1, 0, 0, 0, 2524, 2525, 3, 198, 89, 0, 2525, 2526, 1, 0, 0, 0, 2526, 2527, 6, 341, 18, 0, 2527, 2528, 6, 341, 19, 0, 2528, 703, 1, 0, 0, 0, 2529, 2530, 7, 10, 0, 0, 2530, 2531, 7, 5, 0, 0, 2531, 2532, 7, 22, 0, 0, 2532, 2533, 7, 9, 0, 0, 2533, 705, 1, 0, 0, 0, 2534, 2535, 3, 20, 0, 0, 2535, 2536, 1, 0, 0, 0, 2536, 2537, 6, 343, 0, 0, 2537, 707, 1, 0, 0, 0, 2538, 2539, 3, 22, 1, 0, 2539, 2540, 1, 0, 0, 0, 2540, 2541, 6, 344, 0, 0, 2541, 709, 1, 0, 0, 0, 2542, 2543, 3, 24, 2, 0, 2543, 2544, 1, 0, 0, 0, 2544, 2545, 6, 345, 0, 0, 2545, 711, 1, 0, 0, 0, 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 718, 722, 725, 734, 736, 747, 1120, 1205, 1209, 1214, 1346, 1351, 1360, 1367, 1372, 1374, 1385, 1393, 1396, 1398, 1403, 1408, 1414, 1421, 1426, 1432, 1435, 1443, 1447, 1588, 1593, 1600, 1602, 1607, 1612, 1619, 1621, 1647, 1652, 1657, 1659, 1665, 1741, 1746, 2219, 2223, 2228, 2233, 2238, 2240, 2244, 2246, 2335, 2339, 2342, 2348, 2350, 60, 0, 1, 0, 5, 1, 0, 5, 2, 0, 5, 4, 0, 5, 5, 0, 5, 6, 0, 5, 7, 0, 5, 8, 0, 5, 9, 0, 5, 10, 0, 5, 11, 0, 5, 13, 0, 5, 14, 0, 5, 15, 0, 5, 16, 0, 5, 17, 0, 5, 18, 0, 5, 19, 0, 7, 57, 0, 4, 0, 0, 7, 106, 0, 7, 80, 0, 7, 158, 0, 7, 70, 0, 7, 68, 0, 7, 103, 0, 7, 104, 0, 7, 108, 0, 7, 107, 0, 5, 3, 0, 7, 85, 0, 7, 47, 0, 7, 58, 0, 7, 63, 0, 7, 148, 0, 7, 82, 0, 7, 101, 0, 7, 100, 0, 7, 102, 0, 7, 105, 0, 5, 0, 0, 7, 17, 0, 7, 66, 0, 7, 65, 0, 7, 113, 0, 7, 64, 0, 5, 12, 0, 7, 93, 0, 7, 94, 0, 7, 60, 0, 7, 59, 0, 1, 291, 0, 1, 292, 1, 1, 293, 2, 7, 84, 0, 7, 71, 0, 7, 78, 0, 7, 67, 0, 7, 98, 0, 7, 99, 0] \ No newline at end of file +[4, 0, 169, 2561, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 2, 342, 7, 342, 2, 343, 7, 343, 2, 344, 7, 344, 2, 345, 7, 345, 2, 346, 7, 346, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 719, 8, 0, 10, 0, 12, 0, 722, 9, 0, 1, 0, 3, 0, 725, 8, 0, 1, 0, 3, 0, 728, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 737, 8, 1, 10, 1, 12, 1, 740, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 748, 8, 2, 11, 2, 12, 2, 749, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 4, 43, 1134, 8, 43, 11, 43, 12, 43, 1135, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 4, 62, 1219, 8, 62, 11, 62, 12, 62, 1220, 1, 62, 1, 62, 3, 62, 1225, 8, 62, 1, 62, 4, 62, 1228, 8, 62, 11, 62, 12, 62, 1229, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 3, 95, 1362, 8, 95, 1, 95, 4, 95, 1365, 8, 95, 11, 95, 12, 95, 1366, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 3, 98, 1376, 8, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 3, 100, 1383, 8, 100, 1, 101, 1, 101, 1, 101, 5, 101, 1388, 8, 101, 10, 101, 12, 101, 1391, 9, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 5, 101, 1399, 8, 101, 10, 101, 12, 101, 1402, 9, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 1409, 8, 101, 1, 101, 3, 101, 1412, 8, 101, 3, 101, 1414, 8, 101, 1, 102, 4, 102, 1417, 8, 102, 11, 102, 12, 102, 1418, 1, 103, 4, 103, 1422, 8, 103, 11, 103, 12, 103, 1423, 1, 103, 1, 103, 5, 103, 1428, 8, 103, 10, 103, 12, 103, 1431, 9, 103, 1, 103, 1, 103, 4, 103, 1435, 8, 103, 11, 103, 12, 103, 1436, 1, 103, 4, 103, 1440, 8, 103, 11, 103, 12, 103, 1441, 1, 103, 1, 103, 5, 103, 1446, 8, 103, 10, 103, 12, 103, 1449, 9, 103, 3, 103, 1451, 8, 103, 1, 103, 1, 103, 1, 103, 1, 103, 4, 103, 1457, 8, 103, 11, 103, 12, 103, 1458, 1, 103, 1, 103, 3, 103, 1463, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 3, 145, 1604, 8, 145, 1, 145, 5, 145, 1607, 8, 145, 10, 145, 12, 145, 1610, 9, 145, 1, 145, 1, 145, 4, 145, 1614, 8, 145, 11, 145, 12, 145, 1615, 3, 145, 1618, 8, 145, 1, 146, 1, 146, 1, 146, 3, 146, 1623, 8, 146, 1, 146, 5, 146, 1626, 8, 146, 10, 146, 12, 146, 1629, 9, 146, 1, 146, 1, 146, 4, 146, 1633, 8, 146, 11, 146, 12, 146, 1634, 3, 146, 1637, 8, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 5, 151, 1661, 8, 151, 10, 151, 12, 151, 1664, 9, 151, 1, 151, 1, 151, 3, 151, 1668, 8, 151, 1, 151, 4, 151, 1671, 8, 151, 11, 151, 12, 151, 1672, 3, 151, 1675, 8, 151, 1, 152, 1, 152, 4, 152, 1679, 8, 152, 11, 152, 12, 152, 1680, 1, 152, 1, 152, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 3, 168, 1757, 8, 168, 1, 169, 4, 169, 1760, 8, 169, 11, 169, 12, 169, 1761, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 1, 233, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 3, 276, 2235, 8, 276, 1, 277, 1, 277, 3, 277, 2239, 8, 277, 1, 277, 5, 277, 2242, 8, 277, 10, 277, 12, 277, 2245, 9, 277, 1, 277, 1, 277, 3, 277, 2249, 8, 277, 1, 277, 4, 277, 2252, 8, 277, 11, 277, 12, 277, 2253, 3, 277, 2256, 8, 277, 1, 278, 1, 278, 4, 278, 2260, 8, 278, 11, 278, 12, 278, 2261, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 5, 298, 2349, 8, 298, 10, 298, 12, 298, 2352, 9, 298, 1, 298, 3, 298, 2355, 8, 298, 1, 298, 3, 298, 2358, 8, 298, 1, 299, 1, 299, 1, 299, 1, 299, 5, 299, 2364, 8, 299, 10, 299, 12, 299, 2367, 9, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 1, 311, 1, 312, 1, 312, 1, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 314, 1, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 318, 1, 318, 1, 319, 1, 319, 1, 319, 1, 319, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 321, 1, 321, 1, 321, 1, 321, 1, 322, 1, 322, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 1, 324, 1, 325, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 1, 326, 1, 327, 1, 327, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 332, 1, 332, 1, 332, 1, 332, 1, 333, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 1, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 1, 336, 1, 336, 1, 336, 1, 337, 1, 337, 1, 337, 1, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 340, 1, 340, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 344, 1, 344, 1, 344, 1, 344, 1, 345, 1, 345, 1, 345, 1, 345, 1, 346, 1, 346, 1, 346, 1, 346, 2, 738, 1400, 0, 347, 20, 1, 22, 2, 24, 3, 26, 4, 28, 5, 30, 6, 32, 7, 34, 8, 36, 9, 38, 10, 40, 11, 42, 12, 44, 13, 46, 14, 48, 15, 50, 16, 52, 17, 54, 18, 56, 19, 58, 20, 60, 21, 62, 22, 64, 23, 66, 24, 68, 25, 70, 26, 72, 27, 74, 28, 76, 29, 78, 30, 80, 31, 82, 32, 84, 33, 86, 34, 88, 35, 90, 36, 92, 37, 94, 38, 96, 39, 98, 40, 100, 41, 102, 42, 104, 43, 106, 44, 108, 0, 110, 0, 112, 0, 114, 0, 116, 0, 118, 0, 120, 0, 122, 0, 124, 0, 126, 0, 128, 45, 130, 46, 132, 47, 134, 0, 136, 0, 138, 0, 140, 0, 142, 0, 144, 48, 146, 0, 148, 0, 150, 49, 152, 50, 154, 51, 156, 0, 158, 0, 160, 0, 162, 0, 164, 0, 166, 0, 168, 0, 170, 0, 172, 0, 174, 0, 176, 0, 178, 0, 180, 0, 182, 0, 184, 52, 186, 53, 188, 54, 190, 0, 192, 0, 194, 55, 196, 56, 198, 57, 200, 58, 202, 0, 204, 0, 206, 0, 208, 0, 210, 0, 212, 0, 214, 0, 216, 0, 218, 0, 220, 0, 222, 59, 224, 60, 226, 61, 228, 62, 230, 63, 232, 64, 234, 65, 236, 66, 238, 67, 240, 68, 242, 69, 244, 70, 246, 71, 248, 72, 250, 73, 252, 74, 254, 75, 256, 76, 258, 77, 260, 78, 262, 79, 264, 80, 266, 81, 268, 82, 270, 83, 272, 84, 274, 85, 276, 86, 278, 87, 280, 88, 282, 89, 284, 90, 286, 91, 288, 92, 290, 93, 292, 94, 294, 95, 296, 96, 298, 97, 300, 98, 302, 99, 304, 100, 306, 101, 308, 0, 310, 102, 312, 103, 314, 104, 316, 105, 318, 106, 320, 107, 322, 108, 324, 0, 326, 109, 328, 110, 330, 111, 332, 112, 334, 0, 336, 0, 338, 0, 340, 0, 342, 0, 344, 113, 346, 0, 348, 0, 350, 0, 352, 0, 354, 0, 356, 0, 358, 114, 360, 0, 362, 0, 364, 115, 366, 116, 368, 117, 370, 0, 372, 0, 374, 0, 376, 118, 378, 119, 380, 120, 382, 0, 384, 0, 386, 121, 388, 122, 390, 123, 392, 0, 394, 0, 396, 0, 398, 0, 400, 0, 402, 0, 404, 0, 406, 0, 408, 0, 410, 0, 412, 124, 414, 125, 416, 126, 418, 127, 420, 128, 422, 129, 424, 130, 426, 0, 428, 131, 430, 0, 432, 0, 434, 132, 436, 0, 438, 0, 440, 0, 442, 133, 444, 134, 446, 135, 448, 0, 450, 0, 452, 0, 454, 0, 456, 0, 458, 0, 460, 0, 462, 0, 464, 136, 466, 137, 468, 138, 470, 0, 472, 0, 474, 0, 476, 0, 478, 0, 480, 139, 482, 140, 484, 141, 486, 142, 488, 0, 490, 0, 492, 0, 494, 0, 496, 0, 498, 0, 500, 0, 502, 0, 504, 0, 506, 0, 508, 0, 510, 0, 512, 0, 514, 0, 516, 0, 518, 143, 520, 144, 522, 145, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 0, 540, 0, 542, 0, 544, 0, 546, 146, 548, 147, 550, 148, 552, 0, 554, 0, 556, 0, 558, 0, 560, 0, 562, 0, 564, 0, 566, 0, 568, 0, 570, 0, 572, 0, 574, 0, 576, 149, 578, 150, 580, 151, 582, 152, 584, 0, 586, 0, 588, 0, 590, 0, 592, 0, 594, 0, 596, 0, 598, 0, 600, 0, 602, 0, 604, 0, 606, 0, 608, 0, 610, 153, 612, 154, 614, 155, 616, 156, 618, 157, 620, 158, 622, 0, 624, 0, 626, 0, 628, 0, 630, 0, 632, 0, 634, 0, 636, 0, 638, 0, 640, 0, 642, 0, 644, 159, 646, 0, 648, 160, 650, 161, 652, 162, 654, 0, 656, 0, 658, 0, 660, 0, 662, 0, 664, 0, 666, 0, 668, 0, 670, 0, 672, 0, 674, 0, 676, 0, 678, 0, 680, 0, 682, 0, 684, 0, 686, 0, 688, 0, 690, 0, 692, 0, 694, 0, 696, 0, 698, 163, 700, 164, 702, 165, 704, 0, 706, 166, 708, 167, 710, 168, 712, 169, 20, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 39, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 2, 0, 67, 67, 99, 99, 2, 0, 72, 72, 104, 104, 2, 0, 65, 65, 97, 97, 2, 0, 78, 78, 110, 110, 2, 0, 71, 71, 103, 103, 2, 0, 69, 69, 101, 101, 2, 0, 80, 80, 112, 112, 2, 0, 79, 79, 111, 111, 2, 0, 73, 73, 105, 105, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 88, 88, 120, 120, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 68, 68, 100, 100, 2, 0, 83, 83, 115, 115, 2, 0, 86, 86, 118, 118, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 2, 0, 70, 70, 102, 102, 2, 0, 81, 81, 113, 113, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 12, 0, 9, 10, 13, 13, 32, 32, 34, 35, 40, 41, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 12, 0, 9, 10, 13, 13, 32, 32, 34, 34, 40, 41, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 2, 0, 74, 74, 106, 106, 2, 0, 39, 39, 92, 92, 7, 0, 10, 10, 13, 13, 32, 32, 34, 35, 39, 41, 96, 96, 124, 124, 2588, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 0, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 3, 156, 1, 0, 0, 0, 3, 158, 1, 0, 0, 0, 3, 160, 1, 0, 0, 0, 3, 162, 1, 0, 0, 0, 3, 164, 1, 0, 0, 0, 3, 166, 1, 0, 0, 0, 3, 168, 1, 0, 0, 0, 3, 170, 1, 0, 0, 0, 3, 172, 1, 0, 0, 0, 3, 174, 1, 0, 0, 0, 3, 176, 1, 0, 0, 0, 3, 178, 1, 0, 0, 0, 3, 180, 1, 0, 0, 0, 3, 182, 1, 0, 0, 0, 3, 184, 1, 0, 0, 0, 3, 186, 1, 0, 0, 0, 3, 188, 1, 0, 0, 0, 4, 190, 1, 0, 0, 0, 4, 192, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 4, 196, 1, 0, 0, 0, 4, 198, 1, 0, 0, 0, 5, 200, 1, 0, 0, 0, 5, 222, 1, 0, 0, 0, 5, 224, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 5, 228, 1, 0, 0, 0, 5, 230, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 5, 258, 1, 0, 0, 0, 5, 260, 1, 0, 0, 0, 5, 262, 1, 0, 0, 0, 5, 264, 1, 0, 0, 0, 5, 266, 1, 0, 0, 0, 5, 268, 1, 0, 0, 0, 5, 270, 1, 0, 0, 0, 5, 272, 1, 0, 0, 0, 5, 274, 1, 0, 0, 0, 5, 276, 1, 0, 0, 0, 5, 278, 1, 0, 0, 0, 5, 280, 1, 0, 0, 0, 5, 282, 1, 0, 0, 0, 5, 284, 1, 0, 0, 0, 5, 286, 1, 0, 0, 0, 5, 288, 1, 0, 0, 0, 5, 290, 1, 0, 0, 0, 5, 292, 1, 0, 0, 0, 5, 294, 1, 0, 0, 0, 5, 296, 1, 0, 0, 0, 5, 298, 1, 0, 0, 0, 5, 300, 1, 0, 0, 0, 5, 302, 1, 0, 0, 0, 5, 304, 1, 0, 0, 0, 5, 306, 1, 0, 0, 0, 5, 308, 1, 0, 0, 0, 5, 310, 1, 0, 0, 0, 5, 312, 1, 0, 0, 0, 5, 314, 1, 0, 0, 0, 5, 316, 1, 0, 0, 0, 5, 318, 1, 0, 0, 0, 5, 320, 1, 0, 0, 0, 5, 322, 1, 0, 0, 0, 5, 326, 1, 0, 0, 0, 5, 328, 1, 0, 0, 0, 5, 330, 1, 0, 0, 0, 5, 332, 1, 0, 0, 0, 6, 334, 1, 0, 0, 0, 6, 336, 1, 0, 0, 0, 6, 338, 1, 0, 0, 0, 6, 340, 1, 0, 0, 0, 6, 342, 1, 0, 0, 0, 6, 344, 1, 0, 0, 0, 6, 346, 1, 0, 0, 0, 6, 348, 1, 0, 0, 0, 6, 350, 1, 0, 0, 0, 6, 352, 1, 0, 0, 0, 6, 354, 1, 0, 0, 0, 6, 358, 1, 0, 0, 0, 6, 360, 1, 0, 0, 0, 6, 362, 1, 0, 0, 0, 6, 364, 1, 0, 0, 0, 6, 366, 1, 0, 0, 0, 6, 368, 1, 0, 0, 0, 7, 370, 1, 0, 0, 0, 7, 372, 1, 0, 0, 0, 7, 374, 1, 0, 0, 0, 7, 376, 1, 0, 0, 0, 7, 378, 1, 0, 0, 0, 7, 380, 1, 0, 0, 0, 8, 382, 1, 0, 0, 0, 8, 384, 1, 0, 0, 0, 8, 386, 1, 0, 0, 0, 8, 388, 1, 0, 0, 0, 8, 390, 1, 0, 0, 0, 8, 392, 1, 0, 0, 0, 8, 394, 1, 0, 0, 0, 8, 396, 1, 0, 0, 0, 8, 398, 1, 0, 0, 0, 8, 400, 1, 0, 0, 0, 8, 402, 1, 0, 0, 0, 8, 404, 1, 0, 0, 0, 8, 406, 1, 0, 0, 0, 8, 408, 1, 0, 0, 0, 8, 410, 1, 0, 0, 0, 8, 412, 1, 0, 0, 0, 8, 414, 1, 0, 0, 0, 8, 416, 1, 0, 0, 0, 9, 418, 1, 0, 0, 0, 9, 420, 1, 0, 0, 0, 9, 422, 1, 0, 0, 0, 9, 424, 1, 0, 0, 0, 10, 426, 1, 0, 0, 0, 10, 428, 1, 0, 0, 0, 10, 430, 1, 0, 0, 0, 10, 432, 1, 0, 0, 0, 10, 434, 1, 0, 0, 0, 10, 436, 1, 0, 0, 0, 10, 438, 1, 0, 0, 0, 10, 440, 1, 0, 0, 0, 10, 442, 1, 0, 0, 0, 10, 444, 1, 0, 0, 0, 10, 446, 1, 0, 0, 0, 11, 448, 1, 0, 0, 0, 11, 450, 1, 0, 0, 0, 11, 452, 1, 0, 0, 0, 11, 454, 1, 0, 0, 0, 11, 456, 1, 0, 0, 0, 11, 458, 1, 0, 0, 0, 11, 460, 1, 0, 0, 0, 11, 462, 1, 0, 0, 0, 11, 464, 1, 0, 0, 0, 11, 466, 1, 0, 0, 0, 11, 468, 1, 0, 0, 0, 12, 470, 1, 0, 0, 0, 12, 472, 1, 0, 0, 0, 12, 474, 1, 0, 0, 0, 12, 476, 1, 0, 0, 0, 12, 478, 1, 0, 0, 0, 12, 480, 1, 0, 0, 0, 12, 482, 1, 0, 0, 0, 12, 484, 1, 0, 0, 0, 13, 486, 1, 0, 0, 0, 13, 488, 1, 0, 0, 0, 13, 490, 1, 0, 0, 0, 13, 492, 1, 0, 0, 0, 13, 494, 1, 0, 0, 0, 13, 496, 1, 0, 0, 0, 13, 498, 1, 0, 0, 0, 13, 500, 1, 0, 0, 0, 13, 502, 1, 0, 0, 0, 13, 504, 1, 0, 0, 0, 13, 506, 1, 0, 0, 0, 13, 508, 1, 0, 0, 0, 13, 510, 1, 0, 0, 0, 13, 512, 1, 0, 0, 0, 13, 514, 1, 0, 0, 0, 13, 516, 1, 0, 0, 0, 13, 518, 1, 0, 0, 0, 13, 520, 1, 0, 0, 0, 13, 522, 1, 0, 0, 0, 14, 524, 1, 0, 0, 0, 14, 526, 1, 0, 0, 0, 14, 528, 1, 0, 0, 0, 14, 530, 1, 0, 0, 0, 14, 532, 1, 0, 0, 0, 14, 534, 1, 0, 0, 0, 14, 536, 1, 0, 0, 0, 14, 538, 1, 0, 0, 0, 14, 540, 1, 0, 0, 0, 14, 542, 1, 0, 0, 0, 14, 544, 1, 0, 0, 0, 14, 546, 1, 0, 0, 0, 14, 548, 1, 0, 0, 0, 14, 550, 1, 0, 0, 0, 15, 552, 1, 0, 0, 0, 15, 554, 1, 0, 0, 0, 15, 556, 1, 0, 0, 0, 15, 558, 1, 0, 0, 0, 15, 560, 1, 0, 0, 0, 15, 562, 1, 0, 0, 0, 15, 564, 1, 0, 0, 0, 15, 566, 1, 0, 0, 0, 15, 568, 1, 0, 0, 0, 15, 570, 1, 0, 0, 0, 15, 576, 1, 0, 0, 0, 15, 578, 1, 0, 0, 0, 15, 580, 1, 0, 0, 0, 15, 582, 1, 0, 0, 0, 16, 584, 1, 0, 0, 0, 16, 586, 1, 0, 0, 0, 16, 588, 1, 0, 0, 0, 16, 590, 1, 0, 0, 0, 16, 592, 1, 0, 0, 0, 16, 594, 1, 0, 0, 0, 16, 596, 1, 0, 0, 0, 16, 598, 1, 0, 0, 0, 16, 600, 1, 0, 0, 0, 16, 602, 1, 0, 0, 0, 16, 604, 1, 0, 0, 0, 16, 606, 1, 0, 0, 0, 16, 608, 1, 0, 0, 0, 16, 610, 1, 0, 0, 0, 16, 612, 1, 0, 0, 0, 16, 614, 1, 0, 0, 0, 16, 616, 1, 0, 0, 0, 16, 618, 1, 0, 0, 0, 16, 620, 1, 0, 0, 0, 17, 622, 1, 0, 0, 0, 17, 624, 1, 0, 0, 0, 17, 626, 1, 0, 0, 0, 17, 628, 1, 0, 0, 0, 17, 630, 1, 0, 0, 0, 17, 632, 1, 0, 0, 0, 17, 634, 1, 0, 0, 0, 17, 636, 1, 0, 0, 0, 17, 638, 1, 0, 0, 0, 17, 640, 1, 0, 0, 0, 17, 642, 1, 0, 0, 0, 17, 644, 1, 0, 0, 0, 17, 646, 1, 0, 0, 0, 17, 648, 1, 0, 0, 0, 17, 650, 1, 0, 0, 0, 17, 652, 1, 0, 0, 0, 18, 654, 1, 0, 0, 0, 18, 656, 1, 0, 0, 0, 18, 658, 1, 0, 0, 0, 18, 660, 1, 0, 0, 0, 18, 662, 1, 0, 0, 0, 18, 664, 1, 0, 0, 0, 18, 666, 1, 0, 0, 0, 18, 668, 1, 0, 0, 0, 18, 670, 1, 0, 0, 0, 18, 672, 1, 0, 0, 0, 18, 674, 1, 0, 0, 0, 18, 676, 1, 0, 0, 0, 18, 678, 1, 0, 0, 0, 18, 680, 1, 0, 0, 0, 18, 682, 1, 0, 0, 0, 18, 684, 1, 0, 0, 0, 18, 686, 1, 0, 0, 0, 18, 688, 1, 0, 0, 0, 18, 690, 1, 0, 0, 0, 18, 692, 1, 0, 0, 0, 18, 694, 1, 0, 0, 0, 18, 696, 1, 0, 0, 0, 18, 698, 1, 0, 0, 0, 18, 700, 1, 0, 0, 0, 18, 702, 1, 0, 0, 0, 19, 704, 1, 0, 0, 0, 19, 706, 1, 0, 0, 0, 19, 708, 1, 0, 0, 0, 19, 710, 1, 0, 0, 0, 19, 712, 1, 0, 0, 0, 20, 714, 1, 0, 0, 0, 22, 731, 1, 0, 0, 0, 24, 747, 1, 0, 0, 0, 26, 753, 1, 0, 0, 0, 28, 768, 1, 0, 0, 0, 30, 777, 1, 0, 0, 0, 32, 788, 1, 0, 0, 0, 34, 801, 1, 0, 0, 0, 36, 811, 1, 0, 0, 0, 38, 818, 1, 0, 0, 0, 40, 825, 1, 0, 0, 0, 42, 833, 1, 0, 0, 0, 44, 842, 1, 0, 0, 0, 46, 848, 1, 0, 0, 0, 48, 857, 1, 0, 0, 0, 50, 864, 1, 0, 0, 0, 52, 872, 1, 0, 0, 0, 54, 880, 1, 0, 0, 0, 56, 892, 1, 0, 0, 0, 58, 907, 1, 0, 0, 0, 60, 927, 1, 0, 0, 0, 62, 937, 1, 0, 0, 0, 64, 950, 1, 0, 0, 0, 66, 957, 1, 0, 0, 0, 68, 962, 1, 0, 0, 0, 70, 974, 1, 0, 0, 0, 72, 981, 1, 0, 0, 0, 74, 988, 1, 0, 0, 0, 76, 997, 1, 0, 0, 0, 78, 1011, 1, 0, 0, 0, 80, 1020, 1, 0, 0, 0, 82, 1028, 1, 0, 0, 0, 84, 1036, 1, 0, 0, 0, 86, 1045, 1, 0, 0, 0, 88, 1057, 1, 0, 0, 0, 90, 1063, 1, 0, 0, 0, 92, 1075, 1, 0, 0, 0, 94, 1082, 1, 0, 0, 0, 96, 1089, 1, 0, 0, 0, 98, 1101, 1, 0, 0, 0, 100, 1110, 1, 0, 0, 0, 102, 1119, 1, 0, 0, 0, 104, 1125, 1, 0, 0, 0, 106, 1133, 1, 0, 0, 0, 108, 1139, 1, 0, 0, 0, 110, 1144, 1, 0, 0, 0, 112, 1150, 1, 0, 0, 0, 114, 1154, 1, 0, 0, 0, 116, 1158, 1, 0, 0, 0, 118, 1162, 1, 0, 0, 0, 120, 1166, 1, 0, 0, 0, 122, 1170, 1, 0, 0, 0, 124, 1174, 1, 0, 0, 0, 126, 1178, 1, 0, 0, 0, 128, 1182, 1, 0, 0, 0, 130, 1186, 1, 0, 0, 0, 132, 1190, 1, 0, 0, 0, 134, 1194, 1, 0, 0, 0, 136, 1199, 1, 0, 0, 0, 138, 1205, 1, 0, 0, 0, 140, 1210, 1, 0, 0, 0, 142, 1215, 1, 0, 0, 0, 144, 1224, 1, 0, 0, 0, 146, 1231, 1, 0, 0, 0, 148, 1235, 1, 0, 0, 0, 150, 1239, 1, 0, 0, 0, 152, 1243, 1, 0, 0, 0, 154, 1247, 1, 0, 0, 0, 156, 1251, 1, 0, 0, 0, 158, 1257, 1, 0, 0, 0, 160, 1264, 1, 0, 0, 0, 162, 1268, 1, 0, 0, 0, 164, 1272, 1, 0, 0, 0, 166, 1276, 1, 0, 0, 0, 168, 1280, 1, 0, 0, 0, 170, 1284, 1, 0, 0, 0, 172, 1288, 1, 0, 0, 0, 174, 1292, 1, 0, 0, 0, 176, 1296, 1, 0, 0, 0, 178, 1300, 1, 0, 0, 0, 180, 1304, 1, 0, 0, 0, 182, 1308, 1, 0, 0, 0, 184, 1312, 1, 0, 0, 0, 186, 1316, 1, 0, 0, 0, 188, 1320, 1, 0, 0, 0, 190, 1324, 1, 0, 0, 0, 192, 1329, 1, 0, 0, 0, 194, 1334, 1, 0, 0, 0, 196, 1338, 1, 0, 0, 0, 198, 1342, 1, 0, 0, 0, 200, 1346, 1, 0, 0, 0, 202, 1350, 1, 0, 0, 0, 204, 1352, 1, 0, 0, 0, 206, 1354, 1, 0, 0, 0, 208, 1357, 1, 0, 0, 0, 210, 1359, 1, 0, 0, 0, 212, 1368, 1, 0, 0, 0, 214, 1370, 1, 0, 0, 0, 216, 1375, 1, 0, 0, 0, 218, 1377, 1, 0, 0, 0, 220, 1382, 1, 0, 0, 0, 222, 1413, 1, 0, 0, 0, 224, 1416, 1, 0, 0, 0, 226, 1462, 1, 0, 0, 0, 228, 1464, 1, 0, 0, 0, 230, 1468, 1, 0, 0, 0, 232, 1472, 1, 0, 0, 0, 234, 1474, 1, 0, 0, 0, 236, 1477, 1, 0, 0, 0, 238, 1480, 1, 0, 0, 0, 240, 1482, 1, 0, 0, 0, 242, 1484, 1, 0, 0, 0, 244, 1486, 1, 0, 0, 0, 246, 1491, 1, 0, 0, 0, 248, 1493, 1, 0, 0, 0, 250, 1499, 1, 0, 0, 0, 252, 1505, 1, 0, 0, 0, 254, 1508, 1, 0, 0, 0, 256, 1511, 1, 0, 0, 0, 258, 1516, 1, 0, 0, 0, 260, 1521, 1, 0, 0, 0, 262, 1525, 1, 0, 0, 0, 264, 1530, 1, 0, 0, 0, 266, 1536, 1, 0, 0, 0, 268, 1539, 1, 0, 0, 0, 270, 1542, 1, 0, 0, 0, 272, 1544, 1, 0, 0, 0, 274, 1550, 1, 0, 0, 0, 276, 1555, 1, 0, 0, 0, 278, 1560, 1, 0, 0, 0, 280, 1563, 1, 0, 0, 0, 282, 1566, 1, 0, 0, 0, 284, 1569, 1, 0, 0, 0, 286, 1571, 1, 0, 0, 0, 288, 1574, 1, 0, 0, 0, 290, 1576, 1, 0, 0, 0, 292, 1579, 1, 0, 0, 0, 294, 1581, 1, 0, 0, 0, 296, 1583, 1, 0, 0, 0, 298, 1585, 1, 0, 0, 0, 300, 1587, 1, 0, 0, 0, 302, 1589, 1, 0, 0, 0, 304, 1591, 1, 0, 0, 0, 306, 1593, 1, 0, 0, 0, 308, 1596, 1, 0, 0, 0, 310, 1617, 1, 0, 0, 0, 312, 1636, 1, 0, 0, 0, 314, 1638, 1, 0, 0, 0, 316, 1643, 1, 0, 0, 0, 318, 1648, 1, 0, 0, 0, 320, 1653, 1, 0, 0, 0, 322, 1674, 1, 0, 0, 0, 324, 1676, 1, 0, 0, 0, 326, 1684, 1, 0, 0, 0, 328, 1686, 1, 0, 0, 0, 330, 1690, 1, 0, 0, 0, 332, 1694, 1, 0, 0, 0, 334, 1698, 1, 0, 0, 0, 336, 1703, 1, 0, 0, 0, 338, 1707, 1, 0, 0, 0, 340, 1711, 1, 0, 0, 0, 342, 1715, 1, 0, 0, 0, 344, 1719, 1, 0, 0, 0, 346, 1728, 1, 0, 0, 0, 348, 1734, 1, 0, 0, 0, 350, 1738, 1, 0, 0, 0, 352, 1742, 1, 0, 0, 0, 354, 1748, 1, 0, 0, 0, 356, 1756, 1, 0, 0, 0, 358, 1759, 1, 0, 0, 0, 360, 1763, 1, 0, 0, 0, 362, 1767, 1, 0, 0, 0, 364, 1771, 1, 0, 0, 0, 366, 1775, 1, 0, 0, 0, 368, 1779, 1, 0, 0, 0, 370, 1783, 1, 0, 0, 0, 372, 1788, 1, 0, 0, 0, 374, 1794, 1, 0, 0, 0, 376, 1799, 1, 0, 0, 0, 378, 1803, 1, 0, 0, 0, 380, 1807, 1, 0, 0, 0, 382, 1811, 1, 0, 0, 0, 384, 1816, 1, 0, 0, 0, 386, 1822, 1, 0, 0, 0, 388, 1828, 1, 0, 0, 0, 390, 1834, 1, 0, 0, 0, 392, 1838, 1, 0, 0, 0, 394, 1844, 1, 0, 0, 0, 396, 1848, 1, 0, 0, 0, 398, 1852, 1, 0, 0, 0, 400, 1856, 1, 0, 0, 0, 402, 1860, 1, 0, 0, 0, 404, 1864, 1, 0, 0, 0, 406, 1868, 1, 0, 0, 0, 408, 1872, 1, 0, 0, 0, 410, 1876, 1, 0, 0, 0, 412, 1880, 1, 0, 0, 0, 414, 1884, 1, 0, 0, 0, 416, 1888, 1, 0, 0, 0, 418, 1892, 1, 0, 0, 0, 420, 1901, 1, 0, 0, 0, 422, 1905, 1, 0, 0, 0, 424, 1909, 1, 0, 0, 0, 426, 1913, 1, 0, 0, 0, 428, 1918, 1, 0, 0, 0, 430, 1923, 1, 0, 0, 0, 432, 1927, 1, 0, 0, 0, 434, 1933, 1, 0, 0, 0, 436, 1942, 1, 0, 0, 0, 438, 1946, 1, 0, 0, 0, 440, 1950, 1, 0, 0, 0, 442, 1954, 1, 0, 0, 0, 444, 1958, 1, 0, 0, 0, 446, 1962, 1, 0, 0, 0, 448, 1966, 1, 0, 0, 0, 450, 1971, 1, 0, 0, 0, 452, 1977, 1, 0, 0, 0, 454, 1981, 1, 0, 0, 0, 456, 1985, 1, 0, 0, 0, 458, 1989, 1, 0, 0, 0, 460, 1994, 1, 0, 0, 0, 462, 1998, 1, 0, 0, 0, 464, 2002, 1, 0, 0, 0, 466, 2006, 1, 0, 0, 0, 468, 2010, 1, 0, 0, 0, 470, 2014, 1, 0, 0, 0, 472, 2020, 1, 0, 0, 0, 474, 2027, 1, 0, 0, 0, 476, 2031, 1, 0, 0, 0, 478, 2035, 1, 0, 0, 0, 480, 2039, 1, 0, 0, 0, 482, 2043, 1, 0, 0, 0, 484, 2047, 1, 0, 0, 0, 486, 2051, 1, 0, 0, 0, 488, 2056, 1, 0, 0, 0, 490, 2060, 1, 0, 0, 0, 492, 2064, 1, 0, 0, 0, 494, 2068, 1, 0, 0, 0, 496, 2072, 1, 0, 0, 0, 498, 2076, 1, 0, 0, 0, 500, 2080, 1, 0, 0, 0, 502, 2084, 1, 0, 0, 0, 504, 2088, 1, 0, 0, 0, 506, 2092, 1, 0, 0, 0, 508, 2096, 1, 0, 0, 0, 510, 2100, 1, 0, 0, 0, 512, 2104, 1, 0, 0, 0, 514, 2108, 1, 0, 0, 0, 516, 2112, 1, 0, 0, 0, 518, 2116, 1, 0, 0, 0, 520, 2120, 1, 0, 0, 0, 522, 2124, 1, 0, 0, 0, 524, 2128, 1, 0, 0, 0, 526, 2133, 1, 0, 0, 0, 528, 2139, 1, 0, 0, 0, 530, 2143, 1, 0, 0, 0, 532, 2147, 1, 0, 0, 0, 534, 2151, 1, 0, 0, 0, 536, 2155, 1, 0, 0, 0, 538, 2159, 1, 0, 0, 0, 540, 2163, 1, 0, 0, 0, 542, 2167, 1, 0, 0, 0, 544, 2171, 1, 0, 0, 0, 546, 2175, 1, 0, 0, 0, 548, 2179, 1, 0, 0, 0, 550, 2183, 1, 0, 0, 0, 552, 2187, 1, 0, 0, 0, 554, 2192, 1, 0, 0, 0, 556, 2198, 1, 0, 0, 0, 558, 2202, 1, 0, 0, 0, 560, 2206, 1, 0, 0, 0, 562, 2210, 1, 0, 0, 0, 564, 2214, 1, 0, 0, 0, 566, 2218, 1, 0, 0, 0, 568, 2222, 1, 0, 0, 0, 570, 2226, 1, 0, 0, 0, 572, 2234, 1, 0, 0, 0, 574, 2255, 1, 0, 0, 0, 576, 2259, 1, 0, 0, 0, 578, 2263, 1, 0, 0, 0, 580, 2267, 1, 0, 0, 0, 582, 2271, 1, 0, 0, 0, 584, 2275, 1, 0, 0, 0, 586, 2279, 1, 0, 0, 0, 588, 2283, 1, 0, 0, 0, 590, 2287, 1, 0, 0, 0, 592, 2291, 1, 0, 0, 0, 594, 2295, 1, 0, 0, 0, 596, 2299, 1, 0, 0, 0, 598, 2303, 1, 0, 0, 0, 600, 2307, 1, 0, 0, 0, 602, 2311, 1, 0, 0, 0, 604, 2316, 1, 0, 0, 0, 606, 2321, 1, 0, 0, 0, 608, 2327, 1, 0, 0, 0, 610, 2334, 1, 0, 0, 0, 612, 2338, 1, 0, 0, 0, 614, 2342, 1, 0, 0, 0, 616, 2346, 1, 0, 0, 0, 618, 2359, 1, 0, 0, 0, 620, 2370, 1, 0, 0, 0, 622, 2372, 1, 0, 0, 0, 624, 2377, 1, 0, 0, 0, 626, 2383, 1, 0, 0, 0, 628, 2387, 1, 0, 0, 0, 630, 2391, 1, 0, 0, 0, 632, 2395, 1, 0, 0, 0, 634, 2399, 1, 0, 0, 0, 636, 2403, 1, 0, 0, 0, 638, 2407, 1, 0, 0, 0, 640, 2411, 1, 0, 0, 0, 642, 2415, 1, 0, 0, 0, 644, 2419, 1, 0, 0, 0, 646, 2422, 1, 0, 0, 0, 648, 2426, 1, 0, 0, 0, 650, 2430, 1, 0, 0, 0, 652, 2434, 1, 0, 0, 0, 654, 2438, 1, 0, 0, 0, 656, 2442, 1, 0, 0, 0, 658, 2446, 1, 0, 0, 0, 660, 2450, 1, 0, 0, 0, 662, 2455, 1, 0, 0, 0, 664, 2459, 1, 0, 0, 0, 666, 2463, 1, 0, 0, 0, 668, 2467, 1, 0, 0, 0, 670, 2471, 1, 0, 0, 0, 672, 2475, 1, 0, 0, 0, 674, 2479, 1, 0, 0, 0, 676, 2483, 1, 0, 0, 0, 678, 2487, 1, 0, 0, 0, 680, 2491, 1, 0, 0, 0, 682, 2495, 1, 0, 0, 0, 684, 2499, 1, 0, 0, 0, 686, 2503, 1, 0, 0, 0, 688, 2507, 1, 0, 0, 0, 690, 2511, 1, 0, 0, 0, 692, 2515, 1, 0, 0, 0, 694, 2519, 1, 0, 0, 0, 696, 2523, 1, 0, 0, 0, 698, 2527, 1, 0, 0, 0, 700, 2531, 1, 0, 0, 0, 702, 2535, 1, 0, 0, 0, 704, 2539, 1, 0, 0, 0, 706, 2544, 1, 0, 0, 0, 708, 2549, 1, 0, 0, 0, 710, 2553, 1, 0, 0, 0, 712, 2557, 1, 0, 0, 0, 714, 715, 5, 47, 0, 0, 715, 716, 5, 47, 0, 0, 716, 720, 1, 0, 0, 0, 717, 719, 8, 0, 0, 0, 718, 717, 1, 0, 0, 0, 719, 722, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 724, 1, 0, 0, 0, 722, 720, 1, 0, 0, 0, 723, 725, 5, 13, 0, 0, 724, 723, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 727, 1, 0, 0, 0, 726, 728, 5, 10, 0, 0, 727, 726, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 6, 0, 0, 0, 730, 21, 1, 0, 0, 0, 731, 732, 5, 47, 0, 0, 732, 733, 5, 42, 0, 0, 733, 738, 1, 0, 0, 0, 734, 737, 3, 22, 1, 0, 735, 737, 9, 0, 0, 0, 736, 734, 1, 0, 0, 0, 736, 735, 1, 0, 0, 0, 737, 740, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 739, 741, 1, 0, 0, 0, 740, 738, 1, 0, 0, 0, 741, 742, 5, 42, 0, 0, 742, 743, 5, 47, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 6, 1, 0, 0, 745, 23, 1, 0, 0, 0, 746, 748, 7, 1, 0, 0, 747, 746, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 749, 750, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 752, 6, 2, 0, 0, 752, 25, 1, 0, 0, 0, 753, 754, 7, 2, 0, 0, 754, 755, 7, 3, 0, 0, 755, 756, 7, 4, 0, 0, 756, 757, 7, 5, 0, 0, 757, 758, 7, 6, 0, 0, 758, 759, 7, 7, 0, 0, 759, 760, 5, 95, 0, 0, 760, 761, 7, 8, 0, 0, 761, 762, 7, 9, 0, 0, 762, 763, 7, 10, 0, 0, 763, 764, 7, 5, 0, 0, 764, 765, 7, 11, 0, 0, 765, 766, 1, 0, 0, 0, 766, 767, 6, 3, 1, 0, 767, 27, 1, 0, 0, 0, 768, 769, 7, 7, 0, 0, 769, 770, 7, 5, 0, 0, 770, 771, 7, 12, 0, 0, 771, 772, 7, 10, 0, 0, 772, 773, 7, 2, 0, 0, 773, 774, 7, 3, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 6, 4, 2, 0, 776, 29, 1, 0, 0, 0, 777, 778, 4, 5, 0, 0, 778, 779, 7, 7, 0, 0, 779, 780, 7, 13, 0, 0, 780, 781, 7, 8, 0, 0, 781, 782, 7, 14, 0, 0, 782, 783, 7, 4, 0, 0, 783, 784, 7, 10, 0, 0, 784, 785, 7, 5, 0, 0, 785, 786, 1, 0, 0, 0, 786, 787, 6, 5, 3, 0, 787, 31, 1, 0, 0, 0, 788, 789, 7, 2, 0, 0, 789, 790, 7, 9, 0, 0, 790, 791, 7, 15, 0, 0, 791, 792, 7, 8, 0, 0, 792, 793, 7, 14, 0, 0, 793, 794, 7, 7, 0, 0, 794, 795, 7, 11, 0, 0, 795, 796, 7, 10, 0, 0, 796, 797, 7, 9, 0, 0, 797, 798, 7, 5, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 6, 6, 4, 0, 800, 33, 1, 0, 0, 0, 801, 802, 7, 16, 0, 0, 802, 803, 7, 10, 0, 0, 803, 804, 7, 17, 0, 0, 804, 805, 7, 17, 0, 0, 805, 806, 7, 7, 0, 0, 806, 807, 7, 2, 0, 0, 807, 808, 7, 11, 0, 0, 808, 809, 1, 0, 0, 0, 809, 810, 6, 7, 4, 0, 810, 35, 1, 0, 0, 0, 811, 812, 7, 7, 0, 0, 812, 813, 7, 18, 0, 0, 813, 814, 7, 4, 0, 0, 814, 815, 7, 14, 0, 0, 815, 816, 1, 0, 0, 0, 816, 817, 6, 8, 4, 0, 817, 37, 1, 0, 0, 0, 818, 819, 7, 6, 0, 0, 819, 820, 7, 12, 0, 0, 820, 821, 7, 9, 0, 0, 821, 822, 7, 19, 0, 0, 822, 823, 1, 0, 0, 0, 823, 824, 6, 9, 4, 0, 824, 39, 1, 0, 0, 0, 825, 826, 7, 14, 0, 0, 826, 827, 7, 10, 0, 0, 827, 828, 7, 15, 0, 0, 828, 829, 7, 10, 0, 0, 829, 830, 7, 11, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 6, 10, 4, 0, 832, 41, 1, 0, 0, 0, 833, 834, 7, 12, 0, 0, 834, 835, 7, 7, 0, 0, 835, 836, 7, 12, 0, 0, 836, 837, 7, 4, 0, 0, 837, 838, 7, 5, 0, 0, 838, 839, 7, 19, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 6, 11, 4, 0, 841, 43, 1, 0, 0, 0, 842, 843, 7, 12, 0, 0, 843, 844, 7, 9, 0, 0, 844, 845, 7, 20, 0, 0, 845, 846, 1, 0, 0, 0, 846, 847, 6, 12, 4, 0, 847, 45, 1, 0, 0, 0, 848, 849, 7, 17, 0, 0, 849, 850, 7, 4, 0, 0, 850, 851, 7, 15, 0, 0, 851, 852, 7, 8, 0, 0, 852, 853, 7, 14, 0, 0, 853, 854, 7, 7, 0, 0, 854, 855, 1, 0, 0, 0, 855, 856, 6, 13, 4, 0, 856, 47, 1, 0, 0, 0, 857, 858, 7, 17, 0, 0, 858, 859, 7, 9, 0, 0, 859, 860, 7, 12, 0, 0, 860, 861, 7, 11, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 6, 14, 4, 0, 863, 49, 1, 0, 0, 0, 864, 865, 7, 17, 0, 0, 865, 866, 7, 11, 0, 0, 866, 867, 7, 4, 0, 0, 867, 868, 7, 11, 0, 0, 868, 869, 7, 17, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 6, 15, 4, 0, 871, 51, 1, 0, 0, 0, 872, 873, 7, 20, 0, 0, 873, 874, 7, 3, 0, 0, 874, 875, 7, 7, 0, 0, 875, 876, 7, 12, 0, 0, 876, 877, 7, 7, 0, 0, 877, 878, 1, 0, 0, 0, 878, 879, 6, 16, 4, 0, 879, 53, 1, 0, 0, 0, 880, 881, 7, 21, 0, 0, 881, 882, 7, 12, 0, 0, 882, 883, 7, 10, 0, 0, 883, 884, 5, 95, 0, 0, 884, 885, 7, 8, 0, 0, 885, 886, 7, 4, 0, 0, 886, 887, 7, 12, 0, 0, 887, 888, 7, 11, 0, 0, 888, 889, 7, 17, 0, 0, 889, 890, 1, 0, 0, 0, 890, 891, 6, 17, 4, 0, 891, 55, 1, 0, 0, 0, 892, 893, 7, 15, 0, 0, 893, 894, 7, 7, 0, 0, 894, 895, 7, 11, 0, 0, 895, 896, 7, 12, 0, 0, 896, 897, 7, 10, 0, 0, 897, 898, 7, 2, 0, 0, 898, 899, 7, 17, 0, 0, 899, 900, 5, 95, 0, 0, 900, 901, 7, 10, 0, 0, 901, 902, 7, 5, 0, 0, 902, 903, 7, 22, 0, 0, 903, 904, 7, 9, 0, 0, 904, 905, 1, 0, 0, 0, 905, 906, 6, 18, 4, 0, 906, 57, 1, 0, 0, 0, 907, 908, 7, 12, 0, 0, 908, 909, 7, 7, 0, 0, 909, 910, 7, 6, 0, 0, 910, 911, 7, 10, 0, 0, 911, 912, 7, 17, 0, 0, 912, 913, 7, 11, 0, 0, 913, 914, 7, 7, 0, 0, 914, 915, 7, 12, 0, 0, 915, 916, 7, 7, 0, 0, 916, 917, 7, 16, 0, 0, 917, 918, 5, 95, 0, 0, 918, 919, 7, 16, 0, 0, 919, 920, 7, 9, 0, 0, 920, 921, 7, 15, 0, 0, 921, 922, 7, 4, 0, 0, 922, 923, 7, 10, 0, 0, 923, 924, 7, 5, 0, 0, 924, 925, 1, 0, 0, 0, 925, 926, 6, 19, 4, 0, 926, 59, 1, 0, 0, 0, 927, 928, 7, 11, 0, 0, 928, 929, 7, 17, 0, 0, 929, 930, 5, 95, 0, 0, 930, 931, 7, 10, 0, 0, 931, 932, 7, 5, 0, 0, 932, 933, 7, 22, 0, 0, 933, 934, 7, 9, 0, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 20, 4, 0, 936, 61, 1, 0, 0, 0, 937, 938, 7, 21, 0, 0, 938, 939, 7, 17, 0, 0, 939, 940, 7, 7, 0, 0, 940, 941, 7, 12, 0, 0, 941, 942, 5, 95, 0, 0, 942, 943, 7, 4, 0, 0, 943, 944, 7, 6, 0, 0, 944, 945, 7, 7, 0, 0, 945, 946, 7, 5, 0, 0, 946, 947, 7, 11, 0, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 21, 4, 0, 949, 63, 1, 0, 0, 0, 950, 951, 7, 22, 0, 0, 951, 952, 7, 12, 0, 0, 952, 953, 7, 9, 0, 0, 953, 954, 7, 15, 0, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 22, 5, 0, 956, 65, 1, 0, 0, 0, 957, 958, 7, 11, 0, 0, 958, 959, 7, 17, 0, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 23, 5, 0, 961, 67, 1, 0, 0, 0, 962, 963, 4, 24, 1, 0, 963, 964, 7, 7, 0, 0, 964, 965, 7, 13, 0, 0, 965, 966, 7, 11, 0, 0, 966, 967, 7, 7, 0, 0, 967, 968, 7, 12, 0, 0, 968, 969, 7, 5, 0, 0, 969, 970, 7, 4, 0, 0, 970, 971, 7, 14, 0, 0, 971, 972, 1, 0, 0, 0, 972, 973, 6, 24, 5, 0, 973, 69, 1, 0, 0, 0, 974, 975, 7, 22, 0, 0, 975, 976, 7, 9, 0, 0, 976, 977, 7, 12, 0, 0, 977, 978, 7, 19, 0, 0, 978, 979, 1, 0, 0, 0, 979, 980, 6, 25, 6, 0, 980, 71, 1, 0, 0, 0, 981, 982, 7, 22, 0, 0, 982, 983, 7, 21, 0, 0, 983, 984, 7, 17, 0, 0, 984, 985, 7, 7, 0, 0, 985, 986, 1, 0, 0, 0, 986, 987, 6, 26, 7, 0, 987, 73, 1, 0, 0, 0, 988, 989, 7, 10, 0, 0, 989, 990, 7, 5, 0, 0, 990, 991, 7, 14, 0, 0, 991, 992, 7, 10, 0, 0, 992, 993, 7, 5, 0, 0, 993, 994, 7, 7, 0, 0, 994, 995, 1, 0, 0, 0, 995, 996, 6, 27, 8, 0, 996, 75, 1, 0, 0, 0, 997, 998, 7, 10, 0, 0, 998, 999, 7, 5, 0, 0, 999, 1000, 7, 14, 0, 0, 1000, 1001, 7, 10, 0, 0, 1001, 1002, 7, 5, 0, 0, 1002, 1003, 7, 7, 0, 0, 1003, 1004, 7, 17, 0, 0, 1004, 1005, 7, 11, 0, 0, 1005, 1006, 7, 4, 0, 0, 1006, 1007, 7, 11, 0, 0, 1007, 1008, 7, 17, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1010, 6, 28, 4, 0, 1010, 77, 1, 0, 0, 0, 1011, 1012, 7, 14, 0, 0, 1012, 1013, 7, 9, 0, 0, 1013, 1014, 7, 9, 0, 0, 1014, 1015, 7, 19, 0, 0, 1015, 1016, 7, 21, 0, 0, 1016, 1017, 7, 8, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 6, 29, 9, 0, 1019, 79, 1, 0, 0, 0, 1020, 1021, 4, 30, 2, 0, 1021, 1022, 7, 22, 0, 0, 1022, 1023, 7, 21, 0, 0, 1023, 1024, 7, 14, 0, 0, 1024, 1025, 7, 14, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 6, 30, 9, 0, 1027, 81, 1, 0, 0, 0, 1028, 1029, 4, 31, 3, 0, 1029, 1030, 7, 14, 0, 0, 1030, 1031, 7, 7, 0, 0, 1031, 1032, 7, 22, 0, 0, 1032, 1033, 7, 11, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1035, 6, 31, 9, 0, 1035, 83, 1, 0, 0, 0, 1036, 1037, 4, 32, 4, 0, 1037, 1038, 7, 12, 0, 0, 1038, 1039, 7, 10, 0, 0, 1039, 1040, 7, 6, 0, 0, 1040, 1041, 7, 3, 0, 0, 1041, 1042, 7, 11, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 6, 32, 9, 0, 1044, 85, 1, 0, 0, 0, 1045, 1046, 4, 33, 5, 0, 1046, 1047, 7, 14, 0, 0, 1047, 1048, 7, 9, 0, 0, 1048, 1049, 7, 9, 0, 0, 1049, 1050, 7, 19, 0, 0, 1050, 1051, 7, 21, 0, 0, 1051, 1052, 7, 8, 0, 0, 1052, 1053, 5, 95, 0, 0, 1053, 1054, 5, 128020, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 1056, 6, 33, 10, 0, 1056, 87, 1, 0, 0, 0, 1057, 1058, 7, 15, 0, 0, 1058, 1059, 7, 15, 0, 0, 1059, 1060, 7, 12, 0, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1062, 6, 34, 11, 0, 1062, 89, 1, 0, 0, 0, 1063, 1064, 7, 15, 0, 0, 1064, 1065, 7, 18, 0, 0, 1065, 1066, 5, 95, 0, 0, 1066, 1067, 7, 7, 0, 0, 1067, 1068, 7, 13, 0, 0, 1068, 1069, 7, 8, 0, 0, 1069, 1070, 7, 4, 0, 0, 1070, 1071, 7, 5, 0, 0, 1071, 1072, 7, 16, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 6, 35, 12, 0, 1074, 91, 1, 0, 0, 0, 1075, 1076, 7, 16, 0, 0, 1076, 1077, 7, 12, 0, 0, 1077, 1078, 7, 9, 0, 0, 1078, 1079, 7, 8, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 6, 36, 13, 0, 1081, 93, 1, 0, 0, 0, 1082, 1083, 7, 19, 0, 0, 1083, 1084, 7, 7, 0, 0, 1084, 1085, 7, 7, 0, 0, 1085, 1086, 7, 8, 0, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1088, 6, 37, 13, 0, 1088, 95, 1, 0, 0, 0, 1089, 1090, 4, 38, 6, 0, 1090, 1091, 7, 10, 0, 0, 1091, 1092, 7, 5, 0, 0, 1092, 1093, 7, 17, 0, 0, 1093, 1094, 7, 10, 0, 0, 1094, 1095, 7, 17, 0, 0, 1095, 1096, 7, 11, 0, 0, 1096, 1097, 5, 95, 0, 0, 1097, 1098, 5, 128020, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 6, 38, 13, 0, 1100, 97, 1, 0, 0, 0, 1101, 1102, 7, 8, 0, 0, 1102, 1103, 7, 12, 0, 0, 1103, 1104, 7, 9, 0, 0, 1104, 1105, 7, 15, 0, 0, 1105, 1106, 7, 23, 0, 0, 1106, 1107, 7, 14, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 39, 14, 0, 1109, 99, 1, 0, 0, 0, 1110, 1111, 7, 12, 0, 0, 1111, 1112, 7, 7, 0, 0, 1112, 1113, 7, 5, 0, 0, 1113, 1114, 7, 4, 0, 0, 1114, 1115, 7, 15, 0, 0, 1115, 1116, 7, 7, 0, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 40, 15, 0, 1118, 101, 1, 0, 0, 0, 1119, 1120, 7, 17, 0, 0, 1120, 1121, 7, 7, 0, 0, 1121, 1122, 7, 11, 0, 0, 1122, 1123, 1, 0, 0, 0, 1123, 1124, 6, 41, 16, 0, 1124, 103, 1, 0, 0, 0, 1125, 1126, 7, 17, 0, 0, 1126, 1127, 7, 3, 0, 0, 1127, 1128, 7, 9, 0, 0, 1128, 1129, 7, 20, 0, 0, 1129, 1130, 1, 0, 0, 0, 1130, 1131, 6, 42, 17, 0, 1131, 105, 1, 0, 0, 0, 1132, 1134, 8, 24, 0, 0, 1133, 1132, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 6, 43, 4, 0, 1138, 107, 1, 0, 0, 0, 1139, 1140, 3, 200, 90, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1142, 6, 44, 18, 0, 1142, 1143, 6, 44, 19, 0, 1143, 109, 1, 0, 0, 0, 1144, 1145, 3, 320, 150, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1147, 6, 45, 20, 0, 1147, 1148, 6, 45, 19, 0, 1148, 1149, 6, 45, 19, 0, 1149, 111, 1, 0, 0, 0, 1150, 1151, 3, 266, 123, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 6, 46, 21, 0, 1153, 113, 1, 0, 0, 0, 1154, 1155, 3, 644, 312, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 47, 22, 0, 1157, 115, 1, 0, 0, 0, 1158, 1159, 3, 246, 113, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 6, 48, 23, 0, 1161, 117, 1, 0, 0, 0, 1162, 1163, 3, 242, 111, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 6, 49, 24, 0, 1165, 119, 1, 0, 0, 0, 1166, 1167, 3, 314, 147, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 6, 50, 25, 0, 1169, 121, 1, 0, 0, 0, 1170, 1171, 3, 316, 148, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 51, 26, 0, 1173, 123, 1, 0, 0, 0, 1174, 1175, 3, 326, 153, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 52, 27, 0, 1177, 125, 1, 0, 0, 0, 1178, 1179, 3, 322, 151, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 53, 28, 0, 1181, 127, 1, 0, 0, 0, 1182, 1183, 3, 20, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1185, 6, 54, 0, 0, 1185, 129, 1, 0, 0, 0, 1186, 1187, 3, 22, 1, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1189, 6, 55, 0, 0, 1189, 131, 1, 0, 0, 0, 1190, 1191, 3, 24, 2, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 6, 56, 0, 0, 1193, 133, 1, 0, 0, 0, 1194, 1195, 3, 200, 90, 0, 1195, 1196, 1, 0, 0, 0, 1196, 1197, 6, 57, 18, 0, 1197, 1198, 6, 57, 19, 0, 1198, 135, 1, 0, 0, 0, 1199, 1200, 3, 320, 150, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 6, 58, 20, 0, 1202, 1203, 6, 58, 19, 0, 1203, 1204, 6, 58, 19, 0, 1204, 137, 1, 0, 0, 0, 1205, 1206, 3, 266, 123, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 6, 59, 21, 0, 1208, 1209, 6, 59, 29, 0, 1209, 139, 1, 0, 0, 0, 1210, 1211, 3, 276, 128, 0, 1211, 1212, 1, 0, 0, 0, 1212, 1213, 6, 60, 30, 0, 1213, 1214, 6, 60, 29, 0, 1214, 141, 1, 0, 0, 0, 1215, 1216, 8, 25, 0, 0, 1216, 143, 1, 0, 0, 0, 1217, 1219, 3, 142, 61, 0, 1218, 1217, 1, 0, 0, 0, 1219, 1220, 1, 0, 0, 0, 1220, 1218, 1, 0, 0, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 3, 238, 109, 0, 1223, 1225, 1, 0, 0, 0, 1224, 1218, 1, 0, 0, 0, 1224, 1225, 1, 0, 0, 0, 1225, 1227, 1, 0, 0, 0, 1226, 1228, 3, 142, 61, 0, 1227, 1226, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 145, 1, 0, 0, 0, 1231, 1232, 3, 144, 62, 0, 1232, 1233, 1, 0, 0, 0, 1233, 1234, 6, 63, 31, 0, 1234, 147, 1, 0, 0, 0, 1235, 1236, 3, 222, 101, 0, 1236, 1237, 1, 0, 0, 0, 1237, 1238, 6, 64, 32, 0, 1238, 149, 1, 0, 0, 0, 1239, 1240, 3, 20, 0, 0, 1240, 1241, 1, 0, 0, 0, 1241, 1242, 6, 65, 0, 0, 1242, 151, 1, 0, 0, 0, 1243, 1244, 3, 22, 1, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1246, 6, 66, 0, 0, 1246, 153, 1, 0, 0, 0, 1247, 1248, 3, 24, 2, 0, 1248, 1249, 1, 0, 0, 0, 1249, 1250, 6, 67, 0, 0, 1250, 155, 1, 0, 0, 0, 1251, 1252, 3, 200, 90, 0, 1252, 1253, 1, 0, 0, 0, 1253, 1254, 6, 68, 18, 0, 1254, 1255, 6, 68, 19, 0, 1255, 1256, 6, 68, 19, 0, 1256, 157, 1, 0, 0, 0, 1257, 1258, 3, 320, 150, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1260, 6, 69, 20, 0, 1260, 1261, 6, 69, 19, 0, 1261, 1262, 6, 69, 19, 0, 1262, 1263, 6, 69, 19, 0, 1263, 159, 1, 0, 0, 0, 1264, 1265, 3, 314, 147, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 6, 70, 25, 0, 1267, 161, 1, 0, 0, 0, 1268, 1269, 3, 316, 148, 0, 1269, 1270, 1, 0, 0, 0, 1270, 1271, 6, 71, 26, 0, 1271, 163, 1, 0, 0, 0, 1272, 1273, 3, 232, 106, 0, 1273, 1274, 1, 0, 0, 0, 1274, 1275, 6, 72, 33, 0, 1275, 165, 1, 0, 0, 0, 1276, 1277, 3, 242, 111, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1279, 6, 73, 24, 0, 1279, 167, 1, 0, 0, 0, 1280, 1281, 3, 246, 113, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 6, 74, 23, 0, 1283, 169, 1, 0, 0, 0, 1284, 1285, 3, 276, 128, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1287, 6, 75, 30, 0, 1287, 171, 1, 0, 0, 0, 1288, 1289, 3, 576, 278, 0, 1289, 1290, 1, 0, 0, 0, 1290, 1291, 6, 76, 34, 0, 1291, 173, 1, 0, 0, 0, 1292, 1293, 3, 326, 153, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 6, 77, 27, 0, 1295, 175, 1, 0, 0, 0, 1296, 1297, 3, 270, 125, 0, 1297, 1298, 1, 0, 0, 0, 1298, 1299, 6, 78, 35, 0, 1299, 177, 1, 0, 0, 0, 1300, 1301, 3, 310, 145, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1303, 6, 79, 36, 0, 1303, 179, 1, 0, 0, 0, 1304, 1305, 3, 306, 143, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 6, 80, 37, 0, 1307, 181, 1, 0, 0, 0, 1308, 1309, 3, 312, 146, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1311, 6, 81, 38, 0, 1311, 183, 1, 0, 0, 0, 1312, 1313, 3, 20, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 82, 0, 0, 1315, 185, 1, 0, 0, 0, 1316, 1317, 3, 22, 1, 0, 1317, 1318, 1, 0, 0, 0, 1318, 1319, 6, 83, 0, 0, 1319, 187, 1, 0, 0, 0, 1320, 1321, 3, 24, 2, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1323, 6, 84, 0, 0, 1323, 189, 1, 0, 0, 0, 1324, 1325, 3, 318, 149, 0, 1325, 1326, 1, 0, 0, 0, 1326, 1327, 6, 85, 39, 0, 1327, 1328, 6, 85, 40, 0, 1328, 191, 1, 0, 0, 0, 1329, 1330, 3, 200, 90, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 6, 86, 18, 0, 1332, 1333, 6, 86, 19, 0, 1333, 193, 1, 0, 0, 0, 1334, 1335, 3, 24, 2, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 6, 87, 0, 0, 1337, 195, 1, 0, 0, 0, 1338, 1339, 3, 20, 0, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1341, 6, 88, 0, 0, 1341, 197, 1, 0, 0, 0, 1342, 1343, 3, 22, 1, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1345, 6, 89, 0, 0, 1345, 199, 1, 0, 0, 0, 1346, 1347, 5, 124, 0, 0, 1347, 1348, 1, 0, 0, 0, 1348, 1349, 6, 90, 19, 0, 1349, 201, 1, 0, 0, 0, 1350, 1351, 7, 26, 0, 0, 1351, 203, 1, 0, 0, 0, 1352, 1353, 7, 27, 0, 0, 1353, 205, 1, 0, 0, 0, 1354, 1355, 5, 92, 0, 0, 1355, 1356, 7, 28, 0, 0, 1356, 207, 1, 0, 0, 0, 1357, 1358, 8, 29, 0, 0, 1358, 209, 1, 0, 0, 0, 1359, 1361, 7, 7, 0, 0, 1360, 1362, 7, 30, 0, 0, 1361, 1360, 1, 0, 0, 0, 1361, 1362, 1, 0, 0, 0, 1362, 1364, 1, 0, 0, 0, 1363, 1365, 3, 202, 91, 0, 1364, 1363, 1, 0, 0, 0, 1365, 1366, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1366, 1367, 1, 0, 0, 0, 1367, 211, 1, 0, 0, 0, 1368, 1369, 5, 64, 0, 0, 1369, 213, 1, 0, 0, 0, 1370, 1371, 5, 96, 0, 0, 1371, 215, 1, 0, 0, 0, 1372, 1376, 8, 31, 0, 0, 1373, 1374, 5, 96, 0, 0, 1374, 1376, 5, 96, 0, 0, 1375, 1372, 1, 0, 0, 0, 1375, 1373, 1, 0, 0, 0, 1376, 217, 1, 0, 0, 0, 1377, 1378, 5, 95, 0, 0, 1378, 219, 1, 0, 0, 0, 1379, 1383, 3, 204, 92, 0, 1380, 1383, 3, 202, 91, 0, 1381, 1383, 3, 218, 99, 0, 1382, 1379, 1, 0, 0, 0, 1382, 1380, 1, 0, 0, 0, 1382, 1381, 1, 0, 0, 0, 1383, 221, 1, 0, 0, 0, 1384, 1389, 5, 34, 0, 0, 1385, 1388, 3, 206, 93, 0, 1386, 1388, 3, 208, 94, 0, 1387, 1385, 1, 0, 0, 0, 1387, 1386, 1, 0, 0, 0, 1388, 1391, 1, 0, 0, 0, 1389, 1387, 1, 0, 0, 0, 1389, 1390, 1, 0, 0, 0, 1390, 1392, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1392, 1414, 5, 34, 0, 0, 1393, 1394, 5, 34, 0, 0, 1394, 1395, 5, 34, 0, 0, 1395, 1396, 5, 34, 0, 0, 1396, 1400, 1, 0, 0, 0, 1397, 1399, 8, 0, 0, 0, 1398, 1397, 1, 0, 0, 0, 1399, 1402, 1, 0, 0, 0, 1400, 1401, 1, 0, 0, 0, 1400, 1398, 1, 0, 0, 0, 1401, 1403, 1, 0, 0, 0, 1402, 1400, 1, 0, 0, 0, 1403, 1404, 5, 34, 0, 0, 1404, 1405, 5, 34, 0, 0, 1405, 1406, 5, 34, 0, 0, 1406, 1408, 1, 0, 0, 0, 1407, 1409, 5, 34, 0, 0, 1408, 1407, 1, 0, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1411, 1, 0, 0, 0, 1410, 1412, 5, 34, 0, 0, 1411, 1410, 1, 0, 0, 0, 1411, 1412, 1, 0, 0, 0, 1412, 1414, 1, 0, 0, 0, 1413, 1384, 1, 0, 0, 0, 1413, 1393, 1, 0, 0, 0, 1414, 223, 1, 0, 0, 0, 1415, 1417, 3, 202, 91, 0, 1416, 1415, 1, 0, 0, 0, 1417, 1418, 1, 0, 0, 0, 1418, 1416, 1, 0, 0, 0, 1418, 1419, 1, 0, 0, 0, 1419, 225, 1, 0, 0, 0, 1420, 1422, 3, 202, 91, 0, 1421, 1420, 1, 0, 0, 0, 1422, 1423, 1, 0, 0, 0, 1423, 1421, 1, 0, 0, 0, 1423, 1424, 1, 0, 0, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1429, 3, 246, 113, 0, 1426, 1428, 3, 202, 91, 0, 1427, 1426, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1463, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1432, 1434, 3, 246, 113, 0, 1433, 1435, 3, 202, 91, 0, 1434, 1433, 1, 0, 0, 0, 1435, 1436, 1, 0, 0, 0, 1436, 1434, 1, 0, 0, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1463, 1, 0, 0, 0, 1438, 1440, 3, 202, 91, 0, 1439, 1438, 1, 0, 0, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1439, 1, 0, 0, 0, 1441, 1442, 1, 0, 0, 0, 1442, 1450, 1, 0, 0, 0, 1443, 1447, 3, 246, 113, 0, 1444, 1446, 3, 202, 91, 0, 1445, 1444, 1, 0, 0, 0, 1446, 1449, 1, 0, 0, 0, 1447, 1445, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1451, 1, 0, 0, 0, 1449, 1447, 1, 0, 0, 0, 1450, 1443, 1, 0, 0, 0, 1450, 1451, 1, 0, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1453, 3, 210, 95, 0, 1453, 1463, 1, 0, 0, 0, 1454, 1456, 3, 246, 113, 0, 1455, 1457, 3, 202, 91, 0, 1456, 1455, 1, 0, 0, 0, 1457, 1458, 1, 0, 0, 0, 1458, 1456, 1, 0, 0, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 3, 210, 95, 0, 1461, 1463, 1, 0, 0, 0, 1462, 1421, 1, 0, 0, 0, 1462, 1432, 1, 0, 0, 0, 1462, 1439, 1, 0, 0, 0, 1462, 1454, 1, 0, 0, 0, 1463, 227, 1, 0, 0, 0, 1464, 1465, 7, 4, 0, 0, 1465, 1466, 7, 5, 0, 0, 1466, 1467, 7, 16, 0, 0, 1467, 229, 1, 0, 0, 0, 1468, 1469, 7, 4, 0, 0, 1469, 1470, 7, 17, 0, 0, 1470, 1471, 7, 2, 0, 0, 1471, 231, 1, 0, 0, 0, 1472, 1473, 5, 61, 0, 0, 1473, 233, 1, 0, 0, 0, 1474, 1475, 7, 32, 0, 0, 1475, 1476, 7, 33, 0, 0, 1476, 235, 1, 0, 0, 0, 1477, 1478, 5, 58, 0, 0, 1478, 1479, 5, 58, 0, 0, 1479, 237, 1, 0, 0, 0, 1480, 1481, 5, 58, 0, 0, 1481, 239, 1, 0, 0, 0, 1482, 1483, 5, 59, 0, 0, 1483, 241, 1, 0, 0, 0, 1484, 1485, 5, 44, 0, 0, 1485, 243, 1, 0, 0, 0, 1486, 1487, 7, 16, 0, 0, 1487, 1488, 7, 7, 0, 0, 1488, 1489, 7, 17, 0, 0, 1489, 1490, 7, 2, 0, 0, 1490, 245, 1, 0, 0, 0, 1491, 1492, 5, 46, 0, 0, 1492, 247, 1, 0, 0, 0, 1493, 1494, 7, 22, 0, 0, 1494, 1495, 7, 4, 0, 0, 1495, 1496, 7, 14, 0, 0, 1496, 1497, 7, 17, 0, 0, 1497, 1498, 7, 7, 0, 0, 1498, 249, 1, 0, 0, 0, 1499, 1500, 7, 22, 0, 0, 1500, 1501, 7, 10, 0, 0, 1501, 1502, 7, 12, 0, 0, 1502, 1503, 7, 17, 0, 0, 1503, 1504, 7, 11, 0, 0, 1504, 251, 1, 0, 0, 0, 1505, 1506, 7, 10, 0, 0, 1506, 1507, 7, 5, 0, 0, 1507, 253, 1, 0, 0, 0, 1508, 1509, 7, 10, 0, 0, 1509, 1510, 7, 17, 0, 0, 1510, 255, 1, 0, 0, 0, 1511, 1512, 7, 14, 0, 0, 1512, 1513, 7, 4, 0, 0, 1513, 1514, 7, 17, 0, 0, 1514, 1515, 7, 11, 0, 0, 1515, 257, 1, 0, 0, 0, 1516, 1517, 7, 14, 0, 0, 1517, 1518, 7, 10, 0, 0, 1518, 1519, 7, 19, 0, 0, 1519, 1520, 7, 7, 0, 0, 1520, 259, 1, 0, 0, 0, 1521, 1522, 7, 5, 0, 0, 1522, 1523, 7, 9, 0, 0, 1523, 1524, 7, 11, 0, 0, 1524, 261, 1, 0, 0, 0, 1525, 1526, 7, 5, 0, 0, 1526, 1527, 7, 21, 0, 0, 1527, 1528, 7, 14, 0, 0, 1528, 1529, 7, 14, 0, 0, 1529, 263, 1, 0, 0, 0, 1530, 1531, 7, 5, 0, 0, 1531, 1532, 7, 21, 0, 0, 1532, 1533, 7, 14, 0, 0, 1533, 1534, 7, 14, 0, 0, 1534, 1535, 7, 17, 0, 0, 1535, 265, 1, 0, 0, 0, 1536, 1537, 7, 9, 0, 0, 1537, 1538, 7, 5, 0, 0, 1538, 267, 1, 0, 0, 0, 1539, 1540, 7, 9, 0, 0, 1540, 1541, 7, 12, 0, 0, 1541, 269, 1, 0, 0, 0, 1542, 1543, 5, 63, 0, 0, 1543, 271, 1, 0, 0, 0, 1544, 1545, 7, 12, 0, 0, 1545, 1546, 7, 14, 0, 0, 1546, 1547, 7, 10, 0, 0, 1547, 1548, 7, 19, 0, 0, 1548, 1549, 7, 7, 0, 0, 1549, 273, 1, 0, 0, 0, 1550, 1551, 7, 11, 0, 0, 1551, 1552, 7, 12, 0, 0, 1552, 1553, 7, 21, 0, 0, 1553, 1554, 7, 7, 0, 0, 1554, 275, 1, 0, 0, 0, 1555, 1556, 7, 20, 0, 0, 1556, 1557, 7, 10, 0, 0, 1557, 1558, 7, 11, 0, 0, 1558, 1559, 7, 3, 0, 0, 1559, 277, 1, 0, 0, 0, 1560, 1561, 5, 61, 0, 0, 1561, 1562, 5, 61, 0, 0, 1562, 279, 1, 0, 0, 0, 1563, 1564, 5, 61, 0, 0, 1564, 1565, 5, 126, 0, 0, 1565, 281, 1, 0, 0, 0, 1566, 1567, 5, 33, 0, 0, 1567, 1568, 5, 61, 0, 0, 1568, 283, 1, 0, 0, 0, 1569, 1570, 5, 60, 0, 0, 1570, 285, 1, 0, 0, 0, 1571, 1572, 5, 60, 0, 0, 1572, 1573, 5, 61, 0, 0, 1573, 287, 1, 0, 0, 0, 1574, 1575, 5, 62, 0, 0, 1575, 289, 1, 0, 0, 0, 1576, 1577, 5, 62, 0, 0, 1577, 1578, 5, 61, 0, 0, 1578, 291, 1, 0, 0, 0, 1579, 1580, 5, 43, 0, 0, 1580, 293, 1, 0, 0, 0, 1581, 1582, 5, 45, 0, 0, 1582, 295, 1, 0, 0, 0, 1583, 1584, 5, 42, 0, 0, 1584, 297, 1, 0, 0, 0, 1585, 1586, 5, 47, 0, 0, 1586, 299, 1, 0, 0, 0, 1587, 1588, 5, 37, 0, 0, 1588, 301, 1, 0, 0, 0, 1589, 1590, 5, 123, 0, 0, 1590, 303, 1, 0, 0, 0, 1591, 1592, 5, 125, 0, 0, 1592, 305, 1, 0, 0, 0, 1593, 1594, 5, 63, 0, 0, 1594, 1595, 5, 63, 0, 0, 1595, 307, 1, 0, 0, 0, 1596, 1597, 3, 52, 16, 0, 1597, 1598, 1, 0, 0, 0, 1598, 1599, 6, 144, 41, 0, 1599, 309, 1, 0, 0, 0, 1600, 1603, 3, 270, 125, 0, 1601, 1604, 3, 204, 92, 0, 1602, 1604, 3, 218, 99, 0, 1603, 1601, 1, 0, 0, 0, 1603, 1602, 1, 0, 0, 0, 1604, 1608, 1, 0, 0, 0, 1605, 1607, 3, 220, 100, 0, 1606, 1605, 1, 0, 0, 0, 1607, 1610, 1, 0, 0, 0, 1608, 1606, 1, 0, 0, 0, 1608, 1609, 1, 0, 0, 0, 1609, 1618, 1, 0, 0, 0, 1610, 1608, 1, 0, 0, 0, 1611, 1613, 3, 270, 125, 0, 1612, 1614, 3, 202, 91, 0, 1613, 1612, 1, 0, 0, 0, 1614, 1615, 1, 0, 0, 0, 1615, 1613, 1, 0, 0, 0, 1615, 1616, 1, 0, 0, 0, 1616, 1618, 1, 0, 0, 0, 1617, 1600, 1, 0, 0, 0, 1617, 1611, 1, 0, 0, 0, 1618, 311, 1, 0, 0, 0, 1619, 1622, 3, 306, 143, 0, 1620, 1623, 3, 204, 92, 0, 1621, 1623, 3, 218, 99, 0, 1622, 1620, 1, 0, 0, 0, 1622, 1621, 1, 0, 0, 0, 1623, 1627, 1, 0, 0, 0, 1624, 1626, 3, 220, 100, 0, 1625, 1624, 1, 0, 0, 0, 1626, 1629, 1, 0, 0, 0, 1627, 1625, 1, 0, 0, 0, 1627, 1628, 1, 0, 0, 0, 1628, 1637, 1, 0, 0, 0, 1629, 1627, 1, 0, 0, 0, 1630, 1632, 3, 306, 143, 0, 1631, 1633, 3, 202, 91, 0, 1632, 1631, 1, 0, 0, 0, 1633, 1634, 1, 0, 0, 0, 1634, 1632, 1, 0, 0, 0, 1634, 1635, 1, 0, 0, 0, 1635, 1637, 1, 0, 0, 0, 1636, 1619, 1, 0, 0, 0, 1636, 1630, 1, 0, 0, 0, 1637, 313, 1, 0, 0, 0, 1638, 1639, 5, 91, 0, 0, 1639, 1640, 1, 0, 0, 0, 1640, 1641, 6, 147, 4, 0, 1641, 1642, 6, 147, 4, 0, 1642, 315, 1, 0, 0, 0, 1643, 1644, 5, 93, 0, 0, 1644, 1645, 1, 0, 0, 0, 1645, 1646, 6, 148, 19, 0, 1646, 1647, 6, 148, 19, 0, 1647, 317, 1, 0, 0, 0, 1648, 1649, 5, 40, 0, 0, 1649, 1650, 1, 0, 0, 0, 1650, 1651, 6, 149, 4, 0, 1651, 1652, 6, 149, 4, 0, 1652, 319, 1, 0, 0, 0, 1653, 1654, 5, 41, 0, 0, 1654, 1655, 1, 0, 0, 0, 1655, 1656, 6, 150, 19, 0, 1656, 1657, 6, 150, 19, 0, 1657, 321, 1, 0, 0, 0, 1658, 1662, 3, 204, 92, 0, 1659, 1661, 3, 220, 100, 0, 1660, 1659, 1, 0, 0, 0, 1661, 1664, 1, 0, 0, 0, 1662, 1660, 1, 0, 0, 0, 1662, 1663, 1, 0, 0, 0, 1663, 1675, 1, 0, 0, 0, 1664, 1662, 1, 0, 0, 0, 1665, 1668, 3, 218, 99, 0, 1666, 1668, 3, 212, 96, 0, 1667, 1665, 1, 0, 0, 0, 1667, 1666, 1, 0, 0, 0, 1668, 1670, 1, 0, 0, 0, 1669, 1671, 3, 220, 100, 0, 1670, 1669, 1, 0, 0, 0, 1671, 1672, 1, 0, 0, 0, 1672, 1670, 1, 0, 0, 0, 1672, 1673, 1, 0, 0, 0, 1673, 1675, 1, 0, 0, 0, 1674, 1658, 1, 0, 0, 0, 1674, 1667, 1, 0, 0, 0, 1675, 323, 1, 0, 0, 0, 1676, 1678, 3, 214, 97, 0, 1677, 1679, 3, 216, 98, 0, 1678, 1677, 1, 0, 0, 0, 1679, 1680, 1, 0, 0, 0, 1680, 1678, 1, 0, 0, 0, 1680, 1681, 1, 0, 0, 0, 1681, 1682, 1, 0, 0, 0, 1682, 1683, 3, 214, 97, 0, 1683, 325, 1, 0, 0, 0, 1684, 1685, 3, 324, 152, 0, 1685, 327, 1, 0, 0, 0, 1686, 1687, 3, 20, 0, 0, 1687, 1688, 1, 0, 0, 0, 1688, 1689, 6, 154, 0, 0, 1689, 329, 1, 0, 0, 0, 1690, 1691, 3, 22, 1, 0, 1691, 1692, 1, 0, 0, 0, 1692, 1693, 6, 155, 0, 0, 1693, 331, 1, 0, 0, 0, 1694, 1695, 3, 24, 2, 0, 1695, 1696, 1, 0, 0, 0, 1696, 1697, 6, 156, 0, 0, 1697, 333, 1, 0, 0, 0, 1698, 1699, 3, 200, 90, 0, 1699, 1700, 1, 0, 0, 0, 1700, 1701, 6, 157, 18, 0, 1701, 1702, 6, 157, 19, 0, 1702, 335, 1, 0, 0, 0, 1703, 1704, 3, 238, 109, 0, 1704, 1705, 1, 0, 0, 0, 1705, 1706, 6, 158, 42, 0, 1706, 337, 1, 0, 0, 0, 1707, 1708, 3, 236, 108, 0, 1708, 1709, 1, 0, 0, 0, 1709, 1710, 6, 159, 43, 0, 1710, 339, 1, 0, 0, 0, 1711, 1712, 3, 242, 111, 0, 1712, 1713, 1, 0, 0, 0, 1713, 1714, 6, 160, 24, 0, 1714, 341, 1, 0, 0, 0, 1715, 1716, 3, 232, 106, 0, 1716, 1717, 1, 0, 0, 0, 1717, 1718, 6, 161, 33, 0, 1718, 343, 1, 0, 0, 0, 1719, 1720, 7, 15, 0, 0, 1720, 1721, 7, 7, 0, 0, 1721, 1722, 7, 11, 0, 0, 1722, 1723, 7, 4, 0, 0, 1723, 1724, 7, 16, 0, 0, 1724, 1725, 7, 4, 0, 0, 1725, 1726, 7, 11, 0, 0, 1726, 1727, 7, 4, 0, 0, 1727, 345, 1, 0, 0, 0, 1728, 1729, 3, 276, 128, 0, 1729, 1730, 1, 0, 0, 0, 1730, 1731, 6, 163, 30, 0, 1731, 1732, 6, 163, 19, 0, 1732, 1733, 6, 163, 4, 0, 1733, 347, 1, 0, 0, 0, 1734, 1735, 3, 270, 125, 0, 1735, 1736, 1, 0, 0, 0, 1736, 1737, 6, 164, 35, 0, 1737, 349, 1, 0, 0, 0, 1738, 1739, 3, 310, 145, 0, 1739, 1740, 1, 0, 0, 0, 1740, 1741, 6, 165, 36, 0, 1741, 351, 1, 0, 0, 0, 1742, 1743, 3, 320, 150, 0, 1743, 1744, 1, 0, 0, 0, 1744, 1745, 6, 166, 20, 0, 1745, 1746, 6, 166, 19, 0, 1746, 1747, 6, 166, 19, 0, 1747, 353, 1, 0, 0, 0, 1748, 1749, 3, 318, 149, 0, 1749, 1750, 1, 0, 0, 0, 1750, 1751, 6, 167, 39, 0, 1751, 1752, 6, 167, 40, 0, 1752, 355, 1, 0, 0, 0, 1753, 1757, 8, 34, 0, 0, 1754, 1755, 5, 47, 0, 0, 1755, 1757, 8, 35, 0, 0, 1756, 1753, 1, 0, 0, 0, 1756, 1754, 1, 0, 0, 0, 1757, 357, 1, 0, 0, 0, 1758, 1760, 3, 356, 168, 0, 1759, 1758, 1, 0, 0, 0, 1760, 1761, 1, 0, 0, 0, 1761, 1759, 1, 0, 0, 0, 1761, 1762, 1, 0, 0, 0, 1762, 359, 1, 0, 0, 0, 1763, 1764, 3, 358, 169, 0, 1764, 1765, 1, 0, 0, 0, 1765, 1766, 6, 170, 44, 0, 1766, 361, 1, 0, 0, 0, 1767, 1768, 3, 222, 101, 0, 1768, 1769, 1, 0, 0, 0, 1769, 1770, 6, 171, 32, 0, 1770, 363, 1, 0, 0, 0, 1771, 1772, 3, 20, 0, 0, 1772, 1773, 1, 0, 0, 0, 1773, 1774, 6, 172, 0, 0, 1774, 365, 1, 0, 0, 0, 1775, 1776, 3, 22, 1, 0, 1776, 1777, 1, 0, 0, 0, 1777, 1778, 6, 173, 0, 0, 1778, 367, 1, 0, 0, 0, 1779, 1780, 3, 24, 2, 0, 1780, 1781, 1, 0, 0, 0, 1781, 1782, 6, 174, 0, 0, 1782, 369, 1, 0, 0, 0, 1783, 1784, 3, 318, 149, 0, 1784, 1785, 1, 0, 0, 0, 1785, 1786, 6, 175, 39, 0, 1786, 1787, 6, 175, 40, 0, 1787, 371, 1, 0, 0, 0, 1788, 1789, 3, 320, 150, 0, 1789, 1790, 1, 0, 0, 0, 1790, 1791, 6, 176, 20, 0, 1791, 1792, 6, 176, 19, 0, 1792, 1793, 6, 176, 19, 0, 1793, 373, 1, 0, 0, 0, 1794, 1795, 3, 200, 90, 0, 1795, 1796, 1, 0, 0, 0, 1796, 1797, 6, 177, 18, 0, 1797, 1798, 6, 177, 19, 0, 1798, 375, 1, 0, 0, 0, 1799, 1800, 3, 24, 2, 0, 1800, 1801, 1, 0, 0, 0, 1801, 1802, 6, 178, 0, 0, 1802, 377, 1, 0, 0, 0, 1803, 1804, 3, 20, 0, 0, 1804, 1805, 1, 0, 0, 0, 1805, 1806, 6, 179, 0, 0, 1806, 379, 1, 0, 0, 0, 1807, 1808, 3, 22, 1, 0, 1808, 1809, 1, 0, 0, 0, 1809, 1810, 6, 180, 0, 0, 1810, 381, 1, 0, 0, 0, 1811, 1812, 3, 200, 90, 0, 1812, 1813, 1, 0, 0, 0, 1813, 1814, 6, 181, 18, 0, 1814, 1815, 6, 181, 19, 0, 1815, 383, 1, 0, 0, 0, 1816, 1817, 3, 320, 150, 0, 1817, 1818, 1, 0, 0, 0, 1818, 1819, 6, 182, 20, 0, 1819, 1820, 6, 182, 19, 0, 1820, 1821, 6, 182, 19, 0, 1821, 385, 1, 0, 0, 0, 1822, 1823, 7, 6, 0, 0, 1823, 1824, 7, 12, 0, 0, 1824, 1825, 7, 9, 0, 0, 1825, 1826, 7, 21, 0, 0, 1826, 1827, 7, 8, 0, 0, 1827, 387, 1, 0, 0, 0, 1828, 1829, 7, 17, 0, 0, 1829, 1830, 7, 2, 0, 0, 1830, 1831, 7, 9, 0, 0, 1831, 1832, 7, 12, 0, 0, 1832, 1833, 7, 7, 0, 0, 1833, 389, 1, 0, 0, 0, 1834, 1835, 7, 19, 0, 0, 1835, 1836, 7, 7, 0, 0, 1836, 1837, 7, 33, 0, 0, 1837, 391, 1, 0, 0, 0, 1838, 1839, 3, 276, 128, 0, 1839, 1840, 1, 0, 0, 0, 1840, 1841, 6, 186, 30, 0, 1841, 1842, 6, 186, 19, 0, 1842, 1843, 6, 186, 4, 0, 1843, 393, 1, 0, 0, 0, 1844, 1845, 3, 242, 111, 0, 1845, 1846, 1, 0, 0, 0, 1846, 1847, 6, 187, 24, 0, 1847, 395, 1, 0, 0, 0, 1848, 1849, 3, 246, 113, 0, 1849, 1850, 1, 0, 0, 0, 1850, 1851, 6, 188, 23, 0, 1851, 397, 1, 0, 0, 0, 1852, 1853, 3, 270, 125, 0, 1853, 1854, 1, 0, 0, 0, 1854, 1855, 6, 189, 35, 0, 1855, 399, 1, 0, 0, 0, 1856, 1857, 3, 310, 145, 0, 1857, 1858, 1, 0, 0, 0, 1858, 1859, 6, 190, 36, 0, 1859, 401, 1, 0, 0, 0, 1860, 1861, 3, 306, 143, 0, 1861, 1862, 1, 0, 0, 0, 1862, 1863, 6, 191, 37, 0, 1863, 403, 1, 0, 0, 0, 1864, 1865, 3, 312, 146, 0, 1865, 1866, 1, 0, 0, 0, 1866, 1867, 6, 192, 38, 0, 1867, 405, 1, 0, 0, 0, 1868, 1869, 3, 234, 107, 0, 1869, 1870, 1, 0, 0, 0, 1870, 1871, 6, 193, 45, 0, 1871, 407, 1, 0, 0, 0, 1872, 1873, 3, 326, 153, 0, 1873, 1874, 1, 0, 0, 0, 1874, 1875, 6, 194, 27, 0, 1875, 409, 1, 0, 0, 0, 1876, 1877, 3, 322, 151, 0, 1877, 1878, 1, 0, 0, 0, 1878, 1879, 6, 195, 28, 0, 1879, 411, 1, 0, 0, 0, 1880, 1881, 3, 20, 0, 0, 1881, 1882, 1, 0, 0, 0, 1882, 1883, 6, 196, 0, 0, 1883, 413, 1, 0, 0, 0, 1884, 1885, 3, 22, 1, 0, 1885, 1886, 1, 0, 0, 0, 1886, 1887, 6, 197, 0, 0, 1887, 415, 1, 0, 0, 0, 1888, 1889, 3, 24, 2, 0, 1889, 1890, 1, 0, 0, 0, 1890, 1891, 6, 198, 0, 0, 1891, 417, 1, 0, 0, 0, 1892, 1893, 7, 17, 0, 0, 1893, 1894, 7, 11, 0, 0, 1894, 1895, 7, 4, 0, 0, 1895, 1896, 7, 11, 0, 0, 1896, 1897, 7, 17, 0, 0, 1897, 1898, 1, 0, 0, 0, 1898, 1899, 6, 199, 19, 0, 1899, 1900, 6, 199, 4, 0, 1900, 419, 1, 0, 0, 0, 1901, 1902, 3, 20, 0, 0, 1902, 1903, 1, 0, 0, 0, 1903, 1904, 6, 200, 0, 0, 1904, 421, 1, 0, 0, 0, 1905, 1906, 3, 22, 1, 0, 1906, 1907, 1, 0, 0, 0, 1907, 1908, 6, 201, 0, 0, 1908, 423, 1, 0, 0, 0, 1909, 1910, 3, 24, 2, 0, 1910, 1911, 1, 0, 0, 0, 1911, 1912, 6, 202, 0, 0, 1912, 425, 1, 0, 0, 0, 1913, 1914, 3, 200, 90, 0, 1914, 1915, 1, 0, 0, 0, 1915, 1916, 6, 203, 18, 0, 1916, 1917, 6, 203, 19, 0, 1917, 427, 1, 0, 0, 0, 1918, 1919, 7, 36, 0, 0, 1919, 1920, 7, 9, 0, 0, 1920, 1921, 7, 10, 0, 0, 1921, 1922, 7, 5, 0, 0, 1922, 429, 1, 0, 0, 0, 1923, 1924, 3, 644, 312, 0, 1924, 1925, 1, 0, 0, 0, 1925, 1926, 6, 205, 22, 0, 1926, 431, 1, 0, 0, 0, 1927, 1928, 3, 266, 123, 0, 1928, 1929, 1, 0, 0, 0, 1929, 1930, 6, 206, 21, 0, 1930, 1931, 6, 206, 19, 0, 1931, 1932, 6, 206, 4, 0, 1932, 433, 1, 0, 0, 0, 1933, 1934, 7, 21, 0, 0, 1934, 1935, 7, 17, 0, 0, 1935, 1936, 7, 10, 0, 0, 1936, 1937, 7, 5, 0, 0, 1937, 1938, 7, 6, 0, 0, 1938, 1939, 1, 0, 0, 0, 1939, 1940, 6, 207, 19, 0, 1940, 1941, 6, 207, 4, 0, 1941, 435, 1, 0, 0, 0, 1942, 1943, 3, 358, 169, 0, 1943, 1944, 1, 0, 0, 0, 1944, 1945, 6, 208, 44, 0, 1945, 437, 1, 0, 0, 0, 1946, 1947, 3, 222, 101, 0, 1947, 1948, 1, 0, 0, 0, 1948, 1949, 6, 209, 32, 0, 1949, 439, 1, 0, 0, 0, 1950, 1951, 3, 238, 109, 0, 1951, 1952, 1, 0, 0, 0, 1952, 1953, 6, 210, 42, 0, 1953, 441, 1, 0, 0, 0, 1954, 1955, 3, 20, 0, 0, 1955, 1956, 1, 0, 0, 0, 1956, 1957, 6, 211, 0, 0, 1957, 443, 1, 0, 0, 0, 1958, 1959, 3, 22, 1, 0, 1959, 1960, 1, 0, 0, 0, 1960, 1961, 6, 212, 0, 0, 1961, 445, 1, 0, 0, 0, 1962, 1963, 3, 24, 2, 0, 1963, 1964, 1, 0, 0, 0, 1964, 1965, 6, 213, 0, 0, 1965, 447, 1, 0, 0, 0, 1966, 1967, 3, 200, 90, 0, 1967, 1968, 1, 0, 0, 0, 1968, 1969, 6, 214, 18, 0, 1969, 1970, 6, 214, 19, 0, 1970, 449, 1, 0, 0, 0, 1971, 1972, 3, 320, 150, 0, 1972, 1973, 1, 0, 0, 0, 1973, 1974, 6, 215, 20, 0, 1974, 1975, 6, 215, 19, 0, 1975, 1976, 6, 215, 19, 0, 1976, 451, 1, 0, 0, 0, 1977, 1978, 3, 238, 109, 0, 1978, 1979, 1, 0, 0, 0, 1979, 1980, 6, 216, 42, 0, 1980, 453, 1, 0, 0, 0, 1981, 1982, 3, 242, 111, 0, 1982, 1983, 1, 0, 0, 0, 1983, 1984, 6, 217, 24, 0, 1984, 455, 1, 0, 0, 0, 1985, 1986, 3, 246, 113, 0, 1986, 1987, 1, 0, 0, 0, 1987, 1988, 6, 218, 23, 0, 1988, 457, 1, 0, 0, 0, 1989, 1990, 3, 266, 123, 0, 1990, 1991, 1, 0, 0, 0, 1991, 1992, 6, 219, 21, 0, 1992, 1993, 6, 219, 46, 0, 1993, 459, 1, 0, 0, 0, 1994, 1995, 3, 358, 169, 0, 1995, 1996, 1, 0, 0, 0, 1996, 1997, 6, 220, 44, 0, 1997, 461, 1, 0, 0, 0, 1998, 1999, 3, 222, 101, 0, 1999, 2000, 1, 0, 0, 0, 2000, 2001, 6, 221, 32, 0, 2001, 463, 1, 0, 0, 0, 2002, 2003, 3, 20, 0, 0, 2003, 2004, 1, 0, 0, 0, 2004, 2005, 6, 222, 0, 0, 2005, 465, 1, 0, 0, 0, 2006, 2007, 3, 22, 1, 0, 2007, 2008, 1, 0, 0, 0, 2008, 2009, 6, 223, 0, 0, 2009, 467, 1, 0, 0, 0, 2010, 2011, 3, 24, 2, 0, 2011, 2012, 1, 0, 0, 0, 2012, 2013, 6, 224, 0, 0, 2013, 469, 1, 0, 0, 0, 2014, 2015, 3, 200, 90, 0, 2015, 2016, 1, 0, 0, 0, 2016, 2017, 6, 225, 18, 0, 2017, 2018, 6, 225, 19, 0, 2018, 2019, 6, 225, 19, 0, 2019, 471, 1, 0, 0, 0, 2020, 2021, 3, 320, 150, 0, 2021, 2022, 1, 0, 0, 0, 2022, 2023, 6, 226, 20, 0, 2023, 2024, 6, 226, 19, 0, 2024, 2025, 6, 226, 19, 0, 2025, 2026, 6, 226, 19, 0, 2026, 473, 1, 0, 0, 0, 2027, 2028, 3, 242, 111, 0, 2028, 2029, 1, 0, 0, 0, 2029, 2030, 6, 227, 24, 0, 2030, 475, 1, 0, 0, 0, 2031, 2032, 3, 246, 113, 0, 2032, 2033, 1, 0, 0, 0, 2033, 2034, 6, 228, 23, 0, 2034, 477, 1, 0, 0, 0, 2035, 2036, 3, 576, 278, 0, 2036, 2037, 1, 0, 0, 0, 2037, 2038, 6, 229, 34, 0, 2038, 479, 1, 0, 0, 0, 2039, 2040, 3, 20, 0, 0, 2040, 2041, 1, 0, 0, 0, 2041, 2042, 6, 230, 0, 0, 2042, 481, 1, 0, 0, 0, 2043, 2044, 3, 22, 1, 0, 2044, 2045, 1, 0, 0, 0, 2045, 2046, 6, 231, 0, 0, 2046, 483, 1, 0, 0, 0, 2047, 2048, 3, 24, 2, 0, 2048, 2049, 1, 0, 0, 0, 2049, 2050, 6, 232, 0, 0, 2050, 485, 1, 0, 0, 0, 2051, 2052, 3, 40, 10, 0, 2052, 2053, 1, 0, 0, 0, 2053, 2054, 6, 233, 19, 0, 2054, 2055, 6, 233, 4, 0, 2055, 487, 1, 0, 0, 0, 2056, 2057, 3, 266, 123, 0, 2057, 2058, 1, 0, 0, 0, 2058, 2059, 6, 234, 21, 0, 2059, 489, 1, 0, 0, 0, 2060, 2061, 3, 322, 151, 0, 2061, 2062, 1, 0, 0, 0, 2062, 2063, 6, 235, 28, 0, 2063, 491, 1, 0, 0, 0, 2064, 2065, 3, 314, 147, 0, 2065, 2066, 1, 0, 0, 0, 2066, 2067, 6, 236, 25, 0, 2067, 493, 1, 0, 0, 0, 2068, 2069, 3, 316, 148, 0, 2069, 2070, 1, 0, 0, 0, 2070, 2071, 6, 237, 26, 0, 2071, 495, 1, 0, 0, 0, 2072, 2073, 3, 242, 111, 0, 2073, 2074, 1, 0, 0, 0, 2074, 2075, 6, 238, 24, 0, 2075, 497, 1, 0, 0, 0, 2076, 2077, 3, 292, 136, 0, 2077, 2078, 1, 0, 0, 0, 2078, 2079, 6, 239, 47, 0, 2079, 499, 1, 0, 0, 0, 2080, 2081, 3, 294, 137, 0, 2081, 2082, 1, 0, 0, 0, 2082, 2083, 6, 240, 48, 0, 2083, 501, 1, 0, 0, 0, 2084, 2085, 3, 226, 103, 0, 2085, 2086, 1, 0, 0, 0, 2086, 2087, 6, 241, 49, 0, 2087, 503, 1, 0, 0, 0, 2088, 2089, 3, 224, 102, 0, 2089, 2090, 1, 0, 0, 0, 2090, 2091, 6, 242, 50, 0, 2091, 505, 1, 0, 0, 0, 2092, 2093, 3, 270, 125, 0, 2093, 2094, 1, 0, 0, 0, 2094, 2095, 6, 243, 35, 0, 2095, 507, 1, 0, 0, 0, 2096, 2097, 3, 310, 145, 0, 2097, 2098, 1, 0, 0, 0, 2098, 2099, 6, 244, 36, 0, 2099, 509, 1, 0, 0, 0, 2100, 2101, 3, 318, 149, 0, 2101, 2102, 1, 0, 0, 0, 2102, 2103, 6, 245, 39, 0, 2103, 511, 1, 0, 0, 0, 2104, 2105, 3, 320, 150, 0, 2105, 2106, 1, 0, 0, 0, 2106, 2107, 6, 246, 20, 0, 2107, 513, 1, 0, 0, 0, 2108, 2109, 3, 222, 101, 0, 2109, 2110, 1, 0, 0, 0, 2110, 2111, 6, 247, 32, 0, 2111, 515, 1, 0, 0, 0, 2112, 2113, 3, 236, 108, 0, 2113, 2114, 1, 0, 0, 0, 2114, 2115, 6, 248, 43, 0, 2115, 517, 1, 0, 0, 0, 2116, 2117, 3, 20, 0, 0, 2117, 2118, 1, 0, 0, 0, 2118, 2119, 6, 249, 0, 0, 2119, 519, 1, 0, 0, 0, 2120, 2121, 3, 22, 1, 0, 2121, 2122, 1, 0, 0, 0, 2122, 2123, 6, 250, 0, 0, 2123, 521, 1, 0, 0, 0, 2124, 2125, 3, 24, 2, 0, 2125, 2126, 1, 0, 0, 0, 2126, 2127, 6, 251, 0, 0, 2127, 523, 1, 0, 0, 0, 2128, 2129, 3, 200, 90, 0, 2129, 2130, 1, 0, 0, 0, 2130, 2131, 6, 252, 18, 0, 2131, 2132, 6, 252, 19, 0, 2132, 525, 1, 0, 0, 0, 2133, 2134, 3, 320, 150, 0, 2134, 2135, 1, 0, 0, 0, 2135, 2136, 6, 253, 20, 0, 2136, 2137, 6, 253, 19, 0, 2137, 2138, 6, 253, 19, 0, 2138, 527, 1, 0, 0, 0, 2139, 2140, 3, 314, 147, 0, 2140, 2141, 1, 0, 0, 0, 2141, 2142, 6, 254, 25, 0, 2142, 529, 1, 0, 0, 0, 2143, 2144, 3, 316, 148, 0, 2144, 2145, 1, 0, 0, 0, 2145, 2146, 6, 255, 26, 0, 2146, 531, 1, 0, 0, 0, 2147, 2148, 3, 246, 113, 0, 2148, 2149, 1, 0, 0, 0, 2149, 2150, 6, 256, 23, 0, 2150, 533, 1, 0, 0, 0, 2151, 2152, 3, 270, 125, 0, 2152, 2153, 1, 0, 0, 0, 2153, 2154, 6, 257, 35, 0, 2154, 535, 1, 0, 0, 0, 2155, 2156, 3, 310, 145, 0, 2156, 2157, 1, 0, 0, 0, 2157, 2158, 6, 258, 36, 0, 2158, 537, 1, 0, 0, 0, 2159, 2160, 3, 306, 143, 0, 2160, 2161, 1, 0, 0, 0, 2161, 2162, 6, 259, 37, 0, 2162, 539, 1, 0, 0, 0, 2163, 2164, 3, 312, 146, 0, 2164, 2165, 1, 0, 0, 0, 2165, 2166, 6, 260, 38, 0, 2166, 541, 1, 0, 0, 0, 2167, 2168, 3, 326, 153, 0, 2168, 2169, 1, 0, 0, 0, 2169, 2170, 6, 261, 27, 0, 2170, 543, 1, 0, 0, 0, 2171, 2172, 3, 322, 151, 0, 2172, 2173, 1, 0, 0, 0, 2173, 2174, 6, 262, 28, 0, 2174, 545, 1, 0, 0, 0, 2175, 2176, 3, 20, 0, 0, 2176, 2177, 1, 0, 0, 0, 2177, 2178, 6, 263, 0, 0, 2178, 547, 1, 0, 0, 0, 2179, 2180, 3, 22, 1, 0, 2180, 2181, 1, 0, 0, 0, 2181, 2182, 6, 264, 0, 0, 2182, 549, 1, 0, 0, 0, 2183, 2184, 3, 24, 2, 0, 2184, 2185, 1, 0, 0, 0, 2185, 2186, 6, 265, 0, 0, 2186, 551, 1, 0, 0, 0, 2187, 2188, 3, 200, 90, 0, 2188, 2189, 1, 0, 0, 0, 2189, 2190, 6, 266, 18, 0, 2190, 2191, 6, 266, 19, 0, 2191, 553, 1, 0, 0, 0, 2192, 2193, 3, 320, 150, 0, 2193, 2194, 1, 0, 0, 0, 2194, 2195, 6, 267, 20, 0, 2195, 2196, 6, 267, 19, 0, 2196, 2197, 6, 267, 19, 0, 2197, 555, 1, 0, 0, 0, 2198, 2199, 3, 246, 113, 0, 2199, 2200, 1, 0, 0, 0, 2200, 2201, 6, 268, 23, 0, 2201, 557, 1, 0, 0, 0, 2202, 2203, 3, 314, 147, 0, 2203, 2204, 1, 0, 0, 0, 2204, 2205, 6, 269, 25, 0, 2205, 559, 1, 0, 0, 0, 2206, 2207, 3, 316, 148, 0, 2207, 2208, 1, 0, 0, 0, 2208, 2209, 6, 270, 26, 0, 2209, 561, 1, 0, 0, 0, 2210, 2211, 3, 242, 111, 0, 2211, 2212, 1, 0, 0, 0, 2212, 2213, 6, 271, 24, 0, 2213, 563, 1, 0, 0, 0, 2214, 2215, 3, 270, 125, 0, 2215, 2216, 1, 0, 0, 0, 2216, 2217, 6, 272, 35, 0, 2217, 565, 1, 0, 0, 0, 2218, 2219, 3, 310, 145, 0, 2219, 2220, 1, 0, 0, 0, 2220, 2221, 6, 273, 36, 0, 2221, 567, 1, 0, 0, 0, 2222, 2223, 3, 306, 143, 0, 2223, 2224, 1, 0, 0, 0, 2224, 2225, 6, 274, 37, 0, 2225, 569, 1, 0, 0, 0, 2226, 2227, 3, 312, 146, 0, 2227, 2228, 1, 0, 0, 0, 2228, 2229, 6, 275, 38, 0, 2229, 571, 1, 0, 0, 0, 2230, 2235, 3, 204, 92, 0, 2231, 2235, 3, 202, 91, 0, 2232, 2235, 3, 218, 99, 0, 2233, 2235, 3, 296, 138, 0, 2234, 2230, 1, 0, 0, 0, 2234, 2231, 1, 0, 0, 0, 2234, 2232, 1, 0, 0, 0, 2234, 2233, 1, 0, 0, 0, 2235, 573, 1, 0, 0, 0, 2236, 2239, 3, 204, 92, 0, 2237, 2239, 3, 296, 138, 0, 2238, 2236, 1, 0, 0, 0, 2238, 2237, 1, 0, 0, 0, 2239, 2243, 1, 0, 0, 0, 2240, 2242, 3, 572, 276, 0, 2241, 2240, 1, 0, 0, 0, 2242, 2245, 1, 0, 0, 0, 2243, 2241, 1, 0, 0, 0, 2243, 2244, 1, 0, 0, 0, 2244, 2256, 1, 0, 0, 0, 2245, 2243, 1, 0, 0, 0, 2246, 2249, 3, 218, 99, 0, 2247, 2249, 3, 212, 96, 0, 2248, 2246, 1, 0, 0, 0, 2248, 2247, 1, 0, 0, 0, 2249, 2251, 1, 0, 0, 0, 2250, 2252, 3, 572, 276, 0, 2251, 2250, 1, 0, 0, 0, 2252, 2253, 1, 0, 0, 0, 2253, 2251, 1, 0, 0, 0, 2253, 2254, 1, 0, 0, 0, 2254, 2256, 1, 0, 0, 0, 2255, 2238, 1, 0, 0, 0, 2255, 2248, 1, 0, 0, 0, 2256, 575, 1, 0, 0, 0, 2257, 2260, 3, 574, 277, 0, 2258, 2260, 3, 324, 152, 0, 2259, 2257, 1, 0, 0, 0, 2259, 2258, 1, 0, 0, 0, 2260, 2261, 1, 0, 0, 0, 2261, 2259, 1, 0, 0, 0, 2261, 2262, 1, 0, 0, 0, 2262, 577, 1, 0, 0, 0, 2263, 2264, 3, 20, 0, 0, 2264, 2265, 1, 0, 0, 0, 2265, 2266, 6, 279, 0, 0, 2266, 579, 1, 0, 0, 0, 2267, 2268, 3, 22, 1, 0, 2268, 2269, 1, 0, 0, 0, 2269, 2270, 6, 280, 0, 0, 2270, 581, 1, 0, 0, 0, 2271, 2272, 3, 24, 2, 0, 2272, 2273, 1, 0, 0, 0, 2273, 2274, 6, 281, 0, 0, 2274, 583, 1, 0, 0, 0, 2275, 2276, 3, 322, 151, 0, 2276, 2277, 1, 0, 0, 0, 2277, 2278, 6, 282, 28, 0, 2278, 585, 1, 0, 0, 0, 2279, 2280, 3, 326, 153, 0, 2280, 2281, 1, 0, 0, 0, 2281, 2282, 6, 283, 27, 0, 2282, 587, 1, 0, 0, 0, 2283, 2284, 3, 232, 106, 0, 2284, 2285, 1, 0, 0, 0, 2285, 2286, 6, 284, 33, 0, 2286, 589, 1, 0, 0, 0, 2287, 2288, 3, 310, 145, 0, 2288, 2289, 1, 0, 0, 0, 2289, 2290, 6, 285, 36, 0, 2290, 591, 1, 0, 0, 0, 2291, 2292, 3, 358, 169, 0, 2292, 2293, 1, 0, 0, 0, 2293, 2294, 6, 286, 44, 0, 2294, 593, 1, 0, 0, 0, 2295, 2296, 3, 222, 101, 0, 2296, 2297, 1, 0, 0, 0, 2297, 2298, 6, 287, 32, 0, 2298, 595, 1, 0, 0, 0, 2299, 2300, 3, 238, 109, 0, 2300, 2301, 1, 0, 0, 0, 2301, 2302, 6, 288, 42, 0, 2302, 597, 1, 0, 0, 0, 2303, 2304, 3, 236, 108, 0, 2304, 2305, 1, 0, 0, 0, 2305, 2306, 6, 289, 43, 0, 2306, 599, 1, 0, 0, 0, 2307, 2308, 3, 242, 111, 0, 2308, 2309, 1, 0, 0, 0, 2309, 2310, 6, 290, 24, 0, 2310, 601, 1, 0, 0, 0, 2311, 2312, 3, 200, 90, 0, 2312, 2313, 1, 0, 0, 0, 2313, 2314, 6, 291, 18, 0, 2314, 2315, 6, 291, 19, 0, 2315, 603, 1, 0, 0, 0, 2316, 2317, 3, 318, 149, 0, 2317, 2318, 6, 292, 51, 0, 2318, 2319, 1, 0, 0, 0, 2319, 2320, 6, 292, 39, 0, 2320, 605, 1, 0, 0, 0, 2321, 2322, 5, 41, 0, 0, 2322, 2323, 4, 293, 7, 0, 2323, 2324, 6, 293, 52, 0, 2324, 2325, 1, 0, 0, 0, 2325, 2326, 6, 293, 20, 0, 2326, 607, 1, 0, 0, 0, 2327, 2328, 5, 41, 0, 0, 2328, 2329, 4, 294, 8, 0, 2329, 2330, 6, 294, 53, 0, 2330, 2331, 1, 0, 0, 0, 2331, 2332, 6, 294, 20, 0, 2332, 2333, 6, 294, 19, 0, 2333, 609, 1, 0, 0, 0, 2334, 2335, 3, 20, 0, 0, 2335, 2336, 1, 0, 0, 0, 2336, 2337, 6, 295, 0, 0, 2337, 611, 1, 0, 0, 0, 2338, 2339, 3, 22, 1, 0, 2339, 2340, 1, 0, 0, 0, 2340, 2341, 6, 296, 0, 0, 2341, 613, 1, 0, 0, 0, 2342, 2343, 3, 24, 2, 0, 2343, 2344, 1, 0, 0, 0, 2344, 2345, 6, 297, 0, 0, 2345, 615, 1, 0, 0, 0, 2346, 2350, 5, 35, 0, 0, 2347, 2349, 8, 0, 0, 0, 2348, 2347, 1, 0, 0, 0, 2349, 2352, 1, 0, 0, 0, 2350, 2348, 1, 0, 0, 0, 2350, 2351, 1, 0, 0, 0, 2351, 2354, 1, 0, 0, 0, 2352, 2350, 1, 0, 0, 0, 2353, 2355, 5, 13, 0, 0, 2354, 2353, 1, 0, 0, 0, 2354, 2355, 1, 0, 0, 0, 2355, 2357, 1, 0, 0, 0, 2356, 2358, 5, 10, 0, 0, 2357, 2356, 1, 0, 0, 0, 2357, 2358, 1, 0, 0, 0, 2358, 617, 1, 0, 0, 0, 2359, 2365, 5, 39, 0, 0, 2360, 2361, 5, 92, 0, 0, 2361, 2364, 9, 0, 0, 0, 2362, 2364, 8, 37, 0, 0, 2363, 2360, 1, 0, 0, 0, 2363, 2362, 1, 0, 0, 0, 2364, 2367, 1, 0, 0, 0, 2365, 2363, 1, 0, 0, 0, 2365, 2366, 1, 0, 0, 0, 2366, 2368, 1, 0, 0, 0, 2367, 2365, 1, 0, 0, 0, 2368, 2369, 5, 39, 0, 0, 2369, 619, 1, 0, 0, 0, 2370, 2371, 8, 38, 0, 0, 2371, 621, 1, 0, 0, 0, 2372, 2373, 3, 200, 90, 0, 2373, 2374, 1, 0, 0, 0, 2374, 2375, 6, 301, 18, 0, 2375, 2376, 6, 301, 19, 0, 2376, 623, 1, 0, 0, 0, 2377, 2378, 3, 320, 150, 0, 2378, 2379, 1, 0, 0, 0, 2379, 2380, 6, 302, 20, 0, 2380, 2381, 6, 302, 19, 0, 2381, 2382, 6, 302, 19, 0, 2382, 625, 1, 0, 0, 0, 2383, 2384, 3, 314, 147, 0, 2384, 2385, 1, 0, 0, 0, 2385, 2386, 6, 303, 25, 0, 2386, 627, 1, 0, 0, 0, 2387, 2388, 3, 316, 148, 0, 2388, 2389, 1, 0, 0, 0, 2389, 2390, 6, 304, 26, 0, 2390, 629, 1, 0, 0, 0, 2391, 2392, 3, 232, 106, 0, 2392, 2393, 1, 0, 0, 0, 2393, 2394, 6, 305, 33, 0, 2394, 631, 1, 0, 0, 0, 2395, 2396, 3, 242, 111, 0, 2396, 2397, 1, 0, 0, 0, 2397, 2398, 6, 306, 24, 0, 2398, 633, 1, 0, 0, 0, 2399, 2400, 3, 246, 113, 0, 2400, 2401, 1, 0, 0, 0, 2401, 2402, 6, 307, 23, 0, 2402, 635, 1, 0, 0, 0, 2403, 2404, 3, 270, 125, 0, 2404, 2405, 1, 0, 0, 0, 2405, 2406, 6, 308, 35, 0, 2406, 637, 1, 0, 0, 0, 2407, 2408, 3, 310, 145, 0, 2408, 2409, 1, 0, 0, 0, 2409, 2410, 6, 309, 36, 0, 2410, 639, 1, 0, 0, 0, 2411, 2412, 3, 306, 143, 0, 2412, 2413, 1, 0, 0, 0, 2413, 2414, 6, 310, 37, 0, 2414, 641, 1, 0, 0, 0, 2415, 2416, 3, 312, 146, 0, 2416, 2417, 1, 0, 0, 0, 2417, 2418, 6, 311, 38, 0, 2418, 643, 1, 0, 0, 0, 2419, 2420, 7, 4, 0, 0, 2420, 2421, 7, 17, 0, 0, 2421, 645, 1, 0, 0, 0, 2422, 2423, 3, 576, 278, 0, 2423, 2424, 1, 0, 0, 0, 2424, 2425, 6, 313, 34, 0, 2425, 647, 1, 0, 0, 0, 2426, 2427, 3, 20, 0, 0, 2427, 2428, 1, 0, 0, 0, 2428, 2429, 6, 314, 0, 0, 2429, 649, 1, 0, 0, 0, 2430, 2431, 3, 22, 1, 0, 2431, 2432, 1, 0, 0, 0, 2432, 2433, 6, 315, 0, 0, 2433, 651, 1, 0, 0, 0, 2434, 2435, 3, 24, 2, 0, 2435, 2436, 1, 0, 0, 0, 2436, 2437, 6, 316, 0, 0, 2437, 653, 1, 0, 0, 0, 2438, 2439, 3, 274, 127, 0, 2439, 2440, 1, 0, 0, 0, 2440, 2441, 6, 317, 54, 0, 2441, 655, 1, 0, 0, 0, 2442, 2443, 3, 248, 114, 0, 2443, 2444, 1, 0, 0, 0, 2444, 2445, 6, 318, 55, 0, 2445, 657, 1, 0, 0, 0, 2446, 2447, 3, 262, 121, 0, 2447, 2448, 1, 0, 0, 0, 2448, 2449, 6, 319, 56, 0, 2449, 659, 1, 0, 0, 0, 2450, 2451, 3, 240, 110, 0, 2451, 2452, 1, 0, 0, 0, 2452, 2453, 6, 320, 57, 0, 2453, 2454, 6, 320, 19, 0, 2454, 661, 1, 0, 0, 0, 2455, 2456, 3, 232, 106, 0, 2456, 2457, 1, 0, 0, 0, 2457, 2458, 6, 321, 33, 0, 2458, 663, 1, 0, 0, 0, 2459, 2460, 3, 222, 101, 0, 2460, 2461, 1, 0, 0, 0, 2461, 2462, 6, 322, 32, 0, 2462, 665, 1, 0, 0, 0, 2463, 2464, 3, 322, 151, 0, 2464, 2465, 1, 0, 0, 0, 2465, 2466, 6, 323, 28, 0, 2466, 667, 1, 0, 0, 0, 2467, 2468, 3, 326, 153, 0, 2468, 2469, 1, 0, 0, 0, 2469, 2470, 6, 324, 27, 0, 2470, 669, 1, 0, 0, 0, 2471, 2472, 3, 226, 103, 0, 2472, 2473, 1, 0, 0, 0, 2473, 2474, 6, 325, 49, 0, 2474, 671, 1, 0, 0, 0, 2475, 2476, 3, 224, 102, 0, 2476, 2477, 1, 0, 0, 0, 2477, 2478, 6, 326, 50, 0, 2478, 673, 1, 0, 0, 0, 2479, 2480, 3, 238, 109, 0, 2480, 2481, 1, 0, 0, 0, 2481, 2482, 6, 327, 42, 0, 2482, 675, 1, 0, 0, 0, 2483, 2484, 3, 242, 111, 0, 2484, 2485, 1, 0, 0, 0, 2485, 2486, 6, 328, 24, 0, 2486, 677, 1, 0, 0, 0, 2487, 2488, 3, 246, 113, 0, 2488, 2489, 1, 0, 0, 0, 2489, 2490, 6, 329, 23, 0, 2490, 679, 1, 0, 0, 0, 2491, 2492, 3, 270, 125, 0, 2492, 2493, 1, 0, 0, 0, 2493, 2494, 6, 330, 35, 0, 2494, 681, 1, 0, 0, 0, 2495, 2496, 3, 310, 145, 0, 2496, 2497, 1, 0, 0, 0, 2497, 2498, 6, 331, 36, 0, 2498, 683, 1, 0, 0, 0, 2499, 2500, 3, 302, 141, 0, 2500, 2501, 1, 0, 0, 0, 2501, 2502, 6, 332, 58, 0, 2502, 685, 1, 0, 0, 0, 2503, 2504, 3, 304, 142, 0, 2504, 2505, 1, 0, 0, 0, 2505, 2506, 6, 333, 59, 0, 2506, 687, 1, 0, 0, 0, 2507, 2508, 3, 306, 143, 0, 2508, 2509, 1, 0, 0, 0, 2509, 2510, 6, 334, 37, 0, 2510, 689, 1, 0, 0, 0, 2511, 2512, 3, 312, 146, 0, 2512, 2513, 1, 0, 0, 0, 2513, 2514, 6, 335, 38, 0, 2514, 691, 1, 0, 0, 0, 2515, 2516, 3, 314, 147, 0, 2516, 2517, 1, 0, 0, 0, 2517, 2518, 6, 336, 25, 0, 2518, 693, 1, 0, 0, 0, 2519, 2520, 3, 316, 148, 0, 2520, 2521, 1, 0, 0, 0, 2521, 2522, 6, 337, 26, 0, 2522, 695, 1, 0, 0, 0, 2523, 2524, 3, 576, 278, 0, 2524, 2525, 1, 0, 0, 0, 2525, 2526, 6, 338, 34, 0, 2526, 697, 1, 0, 0, 0, 2527, 2528, 3, 20, 0, 0, 2528, 2529, 1, 0, 0, 0, 2529, 2530, 6, 339, 0, 0, 2530, 699, 1, 0, 0, 0, 2531, 2532, 3, 22, 1, 0, 2532, 2533, 1, 0, 0, 0, 2533, 2534, 6, 340, 0, 0, 2534, 701, 1, 0, 0, 0, 2535, 2536, 3, 24, 2, 0, 2536, 2537, 1, 0, 0, 0, 2537, 2538, 6, 341, 0, 0, 2538, 703, 1, 0, 0, 0, 2539, 2540, 3, 200, 90, 0, 2540, 2541, 1, 0, 0, 0, 2541, 2542, 6, 342, 18, 0, 2542, 2543, 6, 342, 19, 0, 2543, 705, 1, 0, 0, 0, 2544, 2545, 7, 10, 0, 0, 2545, 2546, 7, 5, 0, 0, 2546, 2547, 7, 22, 0, 0, 2547, 2548, 7, 9, 0, 0, 2548, 707, 1, 0, 0, 0, 2549, 2550, 3, 20, 0, 0, 2550, 2551, 1, 0, 0, 0, 2551, 2552, 6, 344, 0, 0, 2552, 709, 1, 0, 0, 0, 2553, 2554, 3, 22, 1, 0, 2554, 2555, 1, 0, 0, 0, 2555, 2556, 6, 345, 0, 0, 2556, 711, 1, 0, 0, 0, 2557, 2558, 3, 24, 2, 0, 2558, 2559, 1, 0, 0, 0, 2559, 2560, 6, 346, 0, 0, 2560, 713, 1, 0, 0, 0, 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 720, 724, 727, 736, 738, 749, 1135, 1220, 1224, 1229, 1361, 1366, 1375, 1382, 1387, 1389, 1400, 1408, 1411, 1413, 1418, 1423, 1429, 1436, 1441, 1447, 1450, 1458, 1462, 1603, 1608, 1615, 1617, 1622, 1627, 1634, 1636, 1662, 1667, 1672, 1674, 1680, 1756, 1761, 2234, 2238, 2243, 2248, 2253, 2255, 2259, 2261, 2350, 2354, 2357, 2363, 2365, 60, 0, 1, 0, 5, 1, 0, 5, 2, 0, 5, 4, 0, 5, 5, 0, 5, 6, 0, 5, 7, 0, 5, 8, 0, 5, 9, 0, 5, 10, 0, 5, 11, 0, 5, 13, 0, 5, 14, 0, 5, 15, 0, 5, 16, 0, 5, 17, 0, 5, 18, 0, 5, 19, 0, 7, 58, 0, 4, 0, 0, 7, 107, 0, 7, 81, 0, 7, 159, 0, 7, 71, 0, 7, 69, 0, 7, 104, 0, 7, 105, 0, 7, 109, 0, 7, 108, 0, 5, 3, 0, 7, 86, 0, 7, 48, 0, 7, 59, 0, 7, 64, 0, 7, 149, 0, 7, 83, 0, 7, 102, 0, 7, 101, 0, 7, 103, 0, 7, 106, 0, 5, 0, 0, 7, 17, 0, 7, 67, 0, 7, 66, 0, 7, 114, 0, 7, 65, 0, 5, 12, 0, 7, 94, 0, 7, 95, 0, 7, 61, 0, 7, 60, 0, 1, 292, 0, 1, 293, 1, 1, 294, 2, 7, 85, 0, 7, 72, 0, 7, 79, 0, 7, 68, 0, 7, 99, 0, 7, 100, 0] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java index bdd34bfe1a54c..d2ca23443ed8d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java @@ -28,38 +28,38 @@ public class EsqlBaseLexer extends LexerConfig { LINE_COMMENT=1, MULTILINE_COMMENT=2, WS=3, CHANGE_POINT=4, ENRICH=5, DEV_EXPLAIN=6, COMPLETION=7, DISSECT=8, EVAL=9, GROK=10, LIMIT=11, RERANK=12, ROW=13, SAMPLE=14, SORT=15, STATS=16, WHERE=17, URI_PARTS=18, METRICS_INFO=19, - REGISTERED_DOMAIN=20, TS_INFO=21, FROM=22, TS=23, DEV_EXTERNAL=24, FORK=25, - FUSE=26, INLINE=27, INLINESTATS=28, JOIN_LOOKUP=29, DEV_JOIN_FULL=30, - DEV_JOIN_LEFT=31, DEV_JOIN_RIGHT=32, DEV_LOOKUP=33, MMR=34, MV_EXPAND=35, - DROP=36, KEEP=37, DEV_INSIST=38, PROMQL=39, RENAME=40, SET=41, SHOW=42, - UNKNOWN_CMD=43, CHANGE_POINT_LINE_COMMENT=44, CHANGE_POINT_MULTILINE_COMMENT=45, - CHANGE_POINT_WS=46, ENRICH_POLICY_NAME=47, ENRICH_LINE_COMMENT=48, ENRICH_MULTILINE_COMMENT=49, - ENRICH_WS=50, ENRICH_FIELD_LINE_COMMENT=51, ENRICH_FIELD_MULTILINE_COMMENT=52, - ENRICH_FIELD_WS=53, EXPLAIN_WS=54, EXPLAIN_LINE_COMMENT=55, EXPLAIN_MULTILINE_COMMENT=56, - PIPE=57, QUOTED_STRING=58, INTEGER_LITERAL=59, DECIMAL_LITERAL=60, AND=61, - ASC=62, ASSIGN=63, BY=64, CAST_OP=65, COLON=66, SEMICOLON=67, COMMA=68, - DESC=69, DOT=70, FALSE=71, FIRST=72, IN=73, IS=74, LAST=75, LIKE=76, NOT=77, - NULL=78, NULLS=79, ON=80, OR=81, PARAM=82, RLIKE=83, TRUE=84, WITH=85, - EQ=86, CIEQ=87, NEQ=88, LT=89, LTE=90, GT=91, GTE=92, PLUS=93, MINUS=94, - ASTERISK=95, SLASH=96, PERCENT=97, LEFT_BRACES=98, RIGHT_BRACES=99, DOUBLE_PARAMS=100, - NAMED_OR_POSITIONAL_PARAM=101, NAMED_OR_POSITIONAL_DOUBLE_PARAMS=102, - OPENING_BRACKET=103, CLOSING_BRACKET=104, LP=105, RP=106, UNQUOTED_IDENTIFIER=107, - QUOTED_IDENTIFIER=108, EXPR_LINE_COMMENT=109, EXPR_MULTILINE_COMMENT=110, - EXPR_WS=111, METADATA=112, UNQUOTED_SOURCE=113, FROM_LINE_COMMENT=114, - FROM_MULTILINE_COMMENT=115, FROM_WS=116, FORK_WS=117, FORK_LINE_COMMENT=118, - FORK_MULTILINE_COMMENT=119, GROUP=120, SCORE=121, KEY=122, FUSE_LINE_COMMENT=123, - FUSE_MULTILINE_COMMENT=124, FUSE_WS=125, INLINE_STATS=126, INLINE_LINE_COMMENT=127, - INLINE_MULTILINE_COMMENT=128, INLINE_WS=129, JOIN=130, USING=131, JOIN_LINE_COMMENT=132, - JOIN_MULTILINE_COMMENT=133, JOIN_WS=134, LOOKUP_LINE_COMMENT=135, LOOKUP_MULTILINE_COMMENT=136, - LOOKUP_WS=137, LOOKUP_FIELD_LINE_COMMENT=138, LOOKUP_FIELD_MULTILINE_COMMENT=139, - LOOKUP_FIELD_WS=140, MMR_LIMIT=141, MMR_LINE_COMMENT=142, MMR_MULTILINE_COMMENT=143, - MMR_WS=144, MVEXPAND_LINE_COMMENT=145, MVEXPAND_MULTILINE_COMMENT=146, - MVEXPAND_WS=147, ID_PATTERN=148, PROJECT_LINE_COMMENT=149, PROJECT_MULTILINE_COMMENT=150, - PROJECT_WS=151, PROMQL_PARAMS_LINE_COMMENT=152, PROMQL_PARAMS_MULTILINE_COMMENT=153, - PROMQL_PARAMS_WS=154, PROMQL_QUERY_COMMENT=155, PROMQL_SINGLE_QUOTED_STRING=156, - PROMQL_OTHER_QUERY_CONTENT=157, AS=158, RENAME_LINE_COMMENT=159, RENAME_MULTILINE_COMMENT=160, - RENAME_WS=161, SET_LINE_COMMENT=162, SET_MULTILINE_COMMENT=163, SET_WS=164, - INFO=165, SHOW_LINE_COMMENT=166, SHOW_MULTILINE_COMMENT=167, SHOW_WS=168; + REGISTERED_DOMAIN=20, TS_INFO=21, USER_AGENT=22, FROM=23, TS=24, DEV_EXTERNAL=25, + FORK=26, FUSE=27, INLINE=28, INLINESTATS=29, JOIN_LOOKUP=30, DEV_JOIN_FULL=31, + DEV_JOIN_LEFT=32, DEV_JOIN_RIGHT=33, DEV_LOOKUP=34, MMR=35, MV_EXPAND=36, + DROP=37, KEEP=38, DEV_INSIST=39, PROMQL=40, RENAME=41, SET=42, SHOW=43, + UNKNOWN_CMD=44, CHANGE_POINT_LINE_COMMENT=45, CHANGE_POINT_MULTILINE_COMMENT=46, + CHANGE_POINT_WS=47, ENRICH_POLICY_NAME=48, ENRICH_LINE_COMMENT=49, ENRICH_MULTILINE_COMMENT=50, + ENRICH_WS=51, ENRICH_FIELD_LINE_COMMENT=52, ENRICH_FIELD_MULTILINE_COMMENT=53, + ENRICH_FIELD_WS=54, EXPLAIN_WS=55, EXPLAIN_LINE_COMMENT=56, EXPLAIN_MULTILINE_COMMENT=57, + PIPE=58, QUOTED_STRING=59, INTEGER_LITERAL=60, DECIMAL_LITERAL=61, AND=62, + ASC=63, ASSIGN=64, BY=65, CAST_OP=66, COLON=67, SEMICOLON=68, COMMA=69, + DESC=70, DOT=71, FALSE=72, FIRST=73, IN=74, IS=75, LAST=76, LIKE=77, NOT=78, + NULL=79, NULLS=80, ON=81, OR=82, PARAM=83, RLIKE=84, TRUE=85, WITH=86, + EQ=87, CIEQ=88, NEQ=89, LT=90, LTE=91, GT=92, GTE=93, PLUS=94, MINUS=95, + ASTERISK=96, SLASH=97, PERCENT=98, LEFT_BRACES=99, RIGHT_BRACES=100, DOUBLE_PARAMS=101, + NAMED_OR_POSITIONAL_PARAM=102, NAMED_OR_POSITIONAL_DOUBLE_PARAMS=103, + OPENING_BRACKET=104, CLOSING_BRACKET=105, LP=106, RP=107, UNQUOTED_IDENTIFIER=108, + QUOTED_IDENTIFIER=109, EXPR_LINE_COMMENT=110, EXPR_MULTILINE_COMMENT=111, + EXPR_WS=112, METADATA=113, UNQUOTED_SOURCE=114, FROM_LINE_COMMENT=115, + FROM_MULTILINE_COMMENT=116, FROM_WS=117, FORK_WS=118, FORK_LINE_COMMENT=119, + FORK_MULTILINE_COMMENT=120, GROUP=121, SCORE=122, KEY=123, FUSE_LINE_COMMENT=124, + FUSE_MULTILINE_COMMENT=125, FUSE_WS=126, INLINE_STATS=127, INLINE_LINE_COMMENT=128, + INLINE_MULTILINE_COMMENT=129, INLINE_WS=130, JOIN=131, USING=132, JOIN_LINE_COMMENT=133, + JOIN_MULTILINE_COMMENT=134, JOIN_WS=135, LOOKUP_LINE_COMMENT=136, LOOKUP_MULTILINE_COMMENT=137, + LOOKUP_WS=138, LOOKUP_FIELD_LINE_COMMENT=139, LOOKUP_FIELD_MULTILINE_COMMENT=140, + LOOKUP_FIELD_WS=141, MMR_LIMIT=142, MMR_LINE_COMMENT=143, MMR_MULTILINE_COMMENT=144, + MMR_WS=145, MVEXPAND_LINE_COMMENT=146, MVEXPAND_MULTILINE_COMMENT=147, + MVEXPAND_WS=148, ID_PATTERN=149, PROJECT_LINE_COMMENT=150, PROJECT_MULTILINE_COMMENT=151, + PROJECT_WS=152, PROMQL_PARAMS_LINE_COMMENT=153, PROMQL_PARAMS_MULTILINE_COMMENT=154, + PROMQL_PARAMS_WS=155, PROMQL_QUERY_COMMENT=156, PROMQL_SINGLE_QUOTED_STRING=157, + PROMQL_OTHER_QUERY_CONTENT=158, AS=159, RENAME_LINE_COMMENT=160, RENAME_MULTILINE_COMMENT=161, + RENAME_WS=162, SET_LINE_COMMENT=163, SET_MULTILINE_COMMENT=164, SET_WS=165, + INFO=166, SHOW_LINE_COMMENT=167, SHOW_MULTILINE_COMMENT=168, SHOW_WS=169; public static final int CHANGE_POINT_MODE=1, ENRICH_MODE=2, ENRICH_FIELD_MODE=3, EXPLAIN_MODE=4, EXPRESSION_MODE=5, FROM_MODE=6, FORK_MODE=7, FUSE_MODE=8, INLINE_MODE=9, @@ -82,13 +82,13 @@ private static String[] makeRuleNames() { "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "URI_PARTS", "METRICS_INFO", - "REGISTERED_DOMAIN", "TS_INFO", "FROM", "TS", "DEV_EXTERNAL", "FORK", - "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", - "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MMR", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", - "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_PIPE", - "CHANGE_POINT_RP", "CHANGE_POINT_ON", "CHANGE_POINT_AS", "CHANGE_POINT_DOT", - "CHANGE_POINT_COMMA", "CHANGE_POINT_OPENING_BRACKET", "CHANGE_POINT_CLOSING_BRACKET", - "CHANGE_POINT_QUOTED_IDENTIFIER", "CHANGE_POINT_UNQUOTED_IDENTIFIER", + "REGISTERED_DOMAIN", "TS_INFO", "USER_AGENT", "FROM", "TS", "DEV_EXTERNAL", + "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", + "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MMR", "MV_EXPAND", + "DROP", "KEEP", "DEV_INSIST", "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", + "CHANGE_POINT_PIPE", "CHANGE_POINT_RP", "CHANGE_POINT_ON", "CHANGE_POINT_AS", + "CHANGE_POINT_DOT", "CHANGE_POINT_COMMA", "CHANGE_POINT_OPENING_BRACKET", + "CHANGE_POINT_CLOSING_BRACKET", "CHANGE_POINT_QUOTED_IDENTIFIER", "CHANGE_POINT_UNQUOTED_IDENTIFIER", "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", "ENRICH_PIPE", "ENRICH_RP", "ENRICH_ON", "ENRICH_WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_QUOTED_POLICY_NAME", @@ -169,17 +169,17 @@ private static String[] makeLiteralNames() { null, null, null, null, "'change_point'", "'enrich'", null, "'completion'", "'dissect'", "'eval'", "'grok'", "'limit'", "'rerank'", "'row'", "'sample'", "'sort'", null, "'where'", "'uri_parts'", "'metrics_info'", "'registered_domain'", - "'ts_info'", "'from'", "'ts'", null, "'fork'", "'fuse'", "'inline'", - "'inlinestats'", "'lookup'", null, null, null, null, "'mmr'", "'mv_expand'", - "'drop'", "'keep'", null, "'promql'", "'rename'", "'set'", "'show'", - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, "'|'", null, null, null, "'and'", "'asc'", "'='", "'by'", - "'::'", "':'", "';'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", - "'is'", "'last'", "'like'", "'not'", "'null'", "'nulls'", "'on'", "'or'", - "'?'", "'rlike'", "'true'", "'with'", "'=='", "'=~'", "'!='", "'<'", - "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", - "'??'", null, null, null, "']'", null, "')'", null, null, null, null, - null, "'metadata'", null, null, null, null, null, null, null, "'group'", + "'ts_info'", "'user_agent'", "'from'", "'ts'", null, "'fork'", "'fuse'", + "'inline'", "'inlinestats'", "'lookup'", null, null, null, null, "'mmr'", + "'mv_expand'", "'drop'", "'keep'", null, "'promql'", "'rename'", "'set'", + "'show'", null, null, null, null, null, null, null, null, null, null, + null, null, null, null, "'|'", null, null, null, "'and'", "'asc'", "'='", + "'by'", "'::'", "':'", "';'", "','", "'desc'", "'.'", "'false'", "'first'", + "'in'", "'is'", "'last'", "'like'", "'not'", "'null'", "'nulls'", "'on'", + "'or'", "'?'", "'rlike'", "'true'", "'with'", "'=='", "'=~'", "'!='", + "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", + "'}'", "'??'", null, null, null, "']'", null, "')'", null, null, null, + null, null, "'metadata'", null, null, null, null, null, null, null, "'group'", "'score'", "'key'", null, null, null, null, null, null, null, "'join'", "'USING'", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, @@ -192,36 +192,37 @@ private static String[] makeSymbolicNames() { null, "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "URI_PARTS", "METRICS_INFO", - "REGISTERED_DOMAIN", "TS_INFO", "FROM", "TS", "DEV_EXTERNAL", "FORK", - "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", - "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MMR", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", - "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_LINE_COMMENT", - "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", "ENRICH_POLICY_NAME", - "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", - "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", - "EXPLAIN_MULTILINE_COMMENT", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", - "DECIMAL_LITERAL", "AND", "ASC", "ASSIGN", "BY", "CAST_OP", "COLON", - "SEMICOLON", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", - "LIKE", "NOT", "NULL", "NULLS", "ON", "OR", "PARAM", "RLIKE", "TRUE", - "WITH", "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", - "ASTERISK", "SLASH", "PERCENT", "LEFT_BRACES", "RIGHT_BRACES", "DOUBLE_PARAMS", - "NAMED_OR_POSITIONAL_PARAM", "NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "OPENING_BRACKET", - "CLOSING_BRACKET", "LP", "RP", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", - "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", - "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", - "FORK_WS", "FORK_LINE_COMMENT", "FORK_MULTILINE_COMMENT", "GROUP", "SCORE", - "KEY", "FUSE_LINE_COMMENT", "FUSE_MULTILINE_COMMENT", "FUSE_WS", "INLINE_STATS", - "INLINE_LINE_COMMENT", "INLINE_MULTILINE_COMMENT", "INLINE_WS", "JOIN", - "USING", "JOIN_LINE_COMMENT", "JOIN_MULTILINE_COMMENT", "JOIN_WS", "LOOKUP_LINE_COMMENT", - "LOOKUP_MULTILINE_COMMENT", "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", - "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", "MMR_LIMIT", "MMR_LINE_COMMENT", - "MMR_MULTILINE_COMMENT", "MMR_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "PROMQL_PARAMS_LINE_COMMENT", "PROMQL_PARAMS_MULTILINE_COMMENT", - "PROMQL_PARAMS_WS", "PROMQL_QUERY_COMMENT", "PROMQL_SINGLE_QUOTED_STRING", - "PROMQL_OTHER_QUERY_CONTENT", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "SET_LINE_COMMENT", "SET_MULTILINE_COMMENT", "SET_WS", "INFO", - "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS" + "REGISTERED_DOMAIN", "TS_INFO", "USER_AGENT", "FROM", "TS", "DEV_EXTERNAL", + "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", + "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MMR", "MV_EXPAND", + "DROP", "KEEP", "DEV_INSIST", "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", + "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", + "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "AND", + "ASC", "ASSIGN", "BY", "CAST_OP", "COLON", "SEMICOLON", "COMMA", "DESC", + "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "NOT", "NULL", "NULLS", + "ON", "OR", "PARAM", "RLIKE", "TRUE", "WITH", "EQ", "CIEQ", "NEQ", "LT", + "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", + "LEFT_BRACES", "RIGHT_BRACES", "DOUBLE_PARAMS", "NAMED_OR_POSITIONAL_PARAM", + "NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "OPENING_BRACKET", "CLOSING_BRACKET", + "LP", "RP", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", "FROM_WS", "FORK_WS", "FORK_LINE_COMMENT", + "FORK_MULTILINE_COMMENT", "GROUP", "SCORE", "KEY", "FUSE_LINE_COMMENT", + "FUSE_MULTILINE_COMMENT", "FUSE_WS", "INLINE_STATS", "INLINE_LINE_COMMENT", + "INLINE_MULTILINE_COMMENT", "INLINE_WS", "JOIN", "USING", "JOIN_LINE_COMMENT", + "JOIN_MULTILINE_COMMENT", "JOIN_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "MMR_LIMIT", "MMR_LINE_COMMENT", "MMR_MULTILINE_COMMENT", + "MMR_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", + "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", + "PROMQL_PARAMS_LINE_COMMENT", "PROMQL_PARAMS_MULTILINE_COMMENT", "PROMQL_PARAMS_WS", + "PROMQL_QUERY_COMMENT", "PROMQL_SINGLE_QUOTED_STRING", "PROMQL_OTHER_QUERY_CONTENT", + "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", + "SET_LINE_COMMENT", "SET_MULTILINE_COMMENT", "SET_WS", "INFO", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", "SHOW_WS" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -286,13 +287,13 @@ public EsqlBaseLexer(CharStream input) { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 291: + case 292: PROMQL_LP_action((RuleContext)_localctx, actionIndex); break; - case 292: + case 293: PROMQL_NESTED_RP_action((RuleContext)_localctx, actionIndex); break; - case 293: + case 294: PROMQL_QUERY_RP_action((RuleContext)_localctx, actionIndex); break; } @@ -323,21 +324,21 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { case 5: return DEV_EXPLAIN_sempred((RuleContext)_localctx, predIndex); - case 23: + case 24: return DEV_EXTERNAL_sempred((RuleContext)_localctx, predIndex); - case 29: - return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex); case 30: - return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex); + return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex); case 31: - return DEV_JOIN_RIGHT_sempred((RuleContext)_localctx, predIndex); + return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex); case 32: + return DEV_JOIN_RIGHT_sempred((RuleContext)_localctx, predIndex); + case 33: return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex); - case 37: + case 38: return DEV_INSIST_sempred((RuleContext)_localctx, predIndex); - case 292: - return PROMQL_NESTED_RP_sempred((RuleContext)_localctx, predIndex); case 293: + return PROMQL_NESTED_RP_sempred((RuleContext)_localctx, predIndex); + case 294: return PROMQL_QUERY_RP_sempred((RuleContext)_localctx, predIndex); } return true; @@ -407,7 +408,7 @@ private boolean PROMQL_QUERY_RP_sempred(RuleContext _localctx, int predIndex) { } private static final String _serializedATNSegment0 = - "\u0004\u0000\u00a8\u09f2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ + "\u0004\u0000\u00a9\u0a01\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+ @@ -514,1595 +515,1605 @@ private boolean PROMQL_QUERY_RP_sempred(RuleContext _localctx, int predIndex) { "\u014f\u0002\u0150\u0007\u0150\u0002\u0151\u0007\u0151\u0002\u0152\u0007"+ "\u0152\u0002\u0153\u0007\u0153\u0002\u0154\u0007\u0154\u0002\u0155\u0007"+ "\u0155\u0002\u0156\u0007\u0156\u0002\u0157\u0007\u0157\u0002\u0158\u0007"+ - "\u0158\u0002\u0159\u0007\u0159\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0005\u0000\u02cd\b\u0000\n\u0000\f\u0000\u02d0\t\u0000\u0001\u0000"+ - "\u0003\u0000\u02d3\b\u0000\u0001\u0000\u0003\u0000\u02d6\b\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0005\u0001\u02df\b\u0001\n\u0001\f\u0001\u02e2\t\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0004\u0002"+ - "\u02ea\b\u0002\u000b\u0002\f\u0002\u02eb\u0001\u0002\u0001\u0002\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0158\u0002\u0159\u0007\u0159\u0002\u015a\u0007\u015a\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0005\u0000\u02cf\b\u0000\n\u0000\f\u0000"+ + "\u02d2\t\u0000\u0001\u0000\u0003\u0000\u02d5\b\u0000\u0001\u0000\u0003"+ + "\u0000\u02d8\b\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0005\u0001\u02e1\b\u0001\n\u0001\f\u0001"+ + "\u02e4\t\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0002\u0004\u0002\u02ec\b\u0002\u000b\u0002\f\u0002\u02ed\u0001"+ + "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001"+ "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+ + "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015"+ - "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ + "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ "\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ "\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ - "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e"+ - "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e"+ "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ "\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001"+ - "!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#"+ - "\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ - "%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ - "%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ - "&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ - "\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+ - ")\u0001)\u0001)\u0001)\u0001*\u0004*\u045f\b*\u000b*\f*\u0460\u0001*\u0001"+ - "*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001"+ - ",\u0001,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001"+ - "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00011\u00011\u0001"+ - "1\u00011\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u0001"+ - "4\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u00016\u00016\u0001"+ - "6\u00016\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ - "8\u00019\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001"+ - ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001=\u0004"+ - "=\u04b4\b=\u000b=\f=\u04b5\u0001=\u0001=\u0003=\u04ba\b=\u0001=\u0004"+ - "=\u04bd\b=\u000b=\f=\u04be\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ - "?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+ - "B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001"+ - "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+ - "E\u0001F\u0001F\u0001F\u0001F\u0001G\u0001G\u0001G\u0001G\u0001H\u0001"+ - "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001"+ - "J\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001M\u0001"+ - "M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+ - "O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001"+ - "R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001"+ - "T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001"+ - "V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001"+ - "Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001"+ - "]\u0001]\u0001^\u0001^\u0003^\u0543\b^\u0001^\u0004^\u0546\b^\u000b^\f"+ - "^\u0547\u0001_\u0001_\u0001`\u0001`\u0001a\u0001a\u0001a\u0003a\u0551"+ - "\ba\u0001b\u0001b\u0001c\u0001c\u0001c\u0003c\u0558\bc\u0001d\u0001d\u0001"+ - "d\u0005d\u055d\bd\nd\fd\u0560\td\u0001d\u0001d\u0001d\u0001d\u0001d\u0001"+ - "d\u0005d\u0568\bd\nd\fd\u056b\td\u0001d\u0001d\u0001d\u0001d\u0001d\u0003"+ - "d\u0572\bd\u0001d\u0003d\u0575\bd\u0003d\u0577\bd\u0001e\u0004e\u057a"+ - "\be\u000be\fe\u057b\u0001f\u0004f\u057f\bf\u000bf\ff\u0580\u0001f\u0001"+ - "f\u0005f\u0585\bf\nf\ff\u0588\tf\u0001f\u0001f\u0004f\u058c\bf\u000bf"+ - "\ff\u058d\u0001f\u0004f\u0591\bf\u000bf\ff\u0592\u0001f\u0001f\u0005f"+ - "\u0597\bf\nf\ff\u059a\tf\u0003f\u059c\bf\u0001f\u0001f\u0001f\u0001f\u0004"+ - "f\u05a2\bf\u000bf\ff\u05a3\u0001f\u0001f\u0003f\u05a8\bf\u0001g\u0001"+ - "g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001j\u0001"+ - "j\u0001j\u0001k\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001n\u0001"+ - "n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001"+ - "q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001r\u0001r\u0001"+ - "s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001"+ - "u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001"+ - "x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ - "y\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001|\u0001|\u0001}\u0001"+ - "}\u0001}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001~\u0001~\u0001~\u0001"+ - "\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001"+ - "\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001"+ - "\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001"+ - "\u0084\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+ - "\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001"+ - "\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001"+ - "\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001"+ - "\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0003"+ - "\u0090\u0635\b\u0090\u0001\u0090\u0005\u0090\u0638\b\u0090\n\u0090\f\u0090"+ - "\u063b\t\u0090\u0001\u0090\u0001\u0090\u0004\u0090\u063f\b\u0090\u000b"+ - "\u0090\f\u0090\u0640\u0003\u0090\u0643\b\u0090\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0003\u0091\u0648\b\u0091\u0001\u0091\u0005\u0091\u064b\b"+ - "\u0091\n\u0091\f\u0091\u064e\t\u0091\u0001\u0091\u0001\u0091\u0004\u0091"+ - "\u0652\b\u0091\u000b\u0091\f\u0091\u0653\u0003\u0091\u0656\b\u0091\u0001"+ - "\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001"+ - "\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001"+ - "\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001"+ - "\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0005\u0096\u066e\b\u0096\n"+ - "\u0096\f\u0096\u0671\t\u0096\u0001\u0096\u0001\u0096\u0003\u0096\u0675"+ - "\b\u0096\u0001\u0096\u0004\u0096\u0678\b\u0096\u000b\u0096\f\u0096\u0679"+ - "\u0003\u0096\u067c\b\u0096\u0001\u0097\u0001\u0097\u0004\u0097\u0680\b"+ - "\u0097\u000b\u0097\f\u0097\u0681\u0001\u0097\u0001\u0097\u0001\u0098\u0001"+ - "\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001"+ - "\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ - "\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ - "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001"+ - "\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ - "\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ - "\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001"+ - "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001"+ - "\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001"+ - "\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0003\u00a7\u06ce"+ - "\b\u00a7\u0001\u00a8\u0004\u00a8\u06d1\b\u00a8\u000b\u00a8\f\u00a8\u06d2"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa"+ - "\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ - "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ - "\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af"+ - "\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ - "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2"+ - "\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3"+ - "\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ - "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6"+ - "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7"+ - "\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8"+ - "\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9"+ - "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba"+ - "\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc"+ - "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd"+ - "\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf"+ - "\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0"+ - "\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2"+ - "\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3"+ - "\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c5"+ - "\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001\u00c6"+ - "\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6"+ - "\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c8\u0001\u00c8"+ - "\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9"+ - "\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00cb"+ - "\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cc\u0001\u00cc"+ - "\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd"+ - "\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00ce"+ - "\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00cf"+ - "\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0"+ - "\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d2"+ - "\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3"+ - "\u0001\u00d3\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5"+ - "\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d6\u0001\u00d6"+ - "\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d7\u0001\u00d7"+ - "\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8"+ - "\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00da\u0001\u00da"+ - "\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00db\u0001\u00db\u0001\u00db"+ - "\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001\u00dd"+ - "\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0001\u00de\u0001\u00de"+ - "\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00df\u0001\u00e0"+ - "\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1"+ - "\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1"+ - "\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e3\u0001\u00e3"+ - "\u0001\u00e3\u0001\u00e3\u0001\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e4"+ - "\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001\u00e6\u0001\u00e6"+ - "\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e7"+ - "\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001\u00e9"+ - "\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00ea\u0001\u00ea\u0001\u00ea"+ - "\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00eb\u0001\u00ec"+ - "\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ed\u0001\u00ed\u0001\u00ed"+ - "\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ee\u0001\u00ef"+ - "\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00f0\u0001\u00f0\u0001\u00f0"+ - "\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f1\u0001\u00f2"+ - "\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f3\u0001\u00f3\u0001\u00f3"+ - "\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f4\u0001\u00f5"+ - "\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f6\u0001\u00f6\u0001\u00f6"+ - "\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f7\u0001\u00f8"+ - "\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f9\u0001\u00f9\u0001\u00f9"+ - "\u0001\u00f9\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fa\u0001\u00fb"+ - "\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fc\u0001\u00fc"+ - "\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001\u00fd"+ - "\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00fe"+ - "\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001\u0100\u0001\u0100"+ - "\u0001\u0100\u0001\u0100\u0001\u0101\u0001\u0101\u0001\u0101\u0001\u0101"+ - "\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0102\u0001\u0103\u0001\u0103"+ - "\u0001\u0103\u0001\u0103\u0001\u0104\u0001\u0104\u0001\u0104\u0001\u0104"+ - "\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0105\u0001\u0106\u0001\u0106"+ - "\u0001\u0106\u0001\u0106\u0001\u0107\u0001\u0107\u0001\u0107\u0001\u0107"+ - "\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0108\u0001\u0109\u0001\u0109"+ - "\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u010a\u0001\u010a\u0001\u010a"+ - "\u0001\u010a\u0001\u010a\u0001\u010a\u0001\u010b\u0001\u010b\u0001\u010b"+ - "\u0001\u010b\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010c\u0001\u010d"+ - "\u0001\u010d\u0001\u010d\u0001\u010d\u0001\u010e\u0001\u010e\u0001\u010e"+ - "\u0001\u010e\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u010f\u0001\u0110"+ - "\u0001\u0110\u0001\u0110\u0001\u0110\u0001\u0111\u0001\u0111\u0001\u0111"+ - "\u0001\u0111\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0112\u0001\u0113"+ - "\u0001\u0113\u0001\u0113\u0001\u0113\u0003\u0113\u08ac\b\u0113\u0001\u0114"+ - "\u0001\u0114\u0003\u0114\u08b0\b\u0114\u0001\u0114\u0005\u0114\u08b3\b"+ - "\u0114\n\u0114\f\u0114\u08b6\t\u0114\u0001\u0114\u0001\u0114\u0003\u0114"+ - "\u08ba\b\u0114\u0001\u0114\u0004\u0114\u08bd\b\u0114\u000b\u0114\f\u0114"+ - "\u08be\u0003\u0114\u08c1\b\u0114\u0001\u0115\u0001\u0115\u0004\u0115\u08c5"+ - "\b\u0115\u000b\u0115\f\u0115\u08c6\u0001\u0116\u0001\u0116\u0001\u0116"+ - "\u0001\u0116\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0117\u0001\u0118"+ - "\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0119\u0001\u0119\u0001\u0119"+ - "\u0001\u0119\u0001\u011a\u0001\u011a\u0001\u011a\u0001\u011a\u0001\u011b"+ - "\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011c\u0001\u011c\u0001\u011c"+ - "\u0001\u011c\u0001\u011d\u0001\u011d\u0001\u011d\u0001\u011d\u0001\u011e"+ - "\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011f\u0001\u011f\u0001\u011f"+ - "\u0001\u011f\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0120\u0001\u0121"+ - "\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0122\u0001\u0122\u0001\u0122"+ - "\u0001\u0122\u0001\u0122\u0001\u0123\u0001\u0123\u0001\u0123\u0001\u0123"+ - "\u0001\u0123\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124"+ + " \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001\""+ + "\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ + "$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001+\u0004+\u046e\b+\u000b+\f+\u046f\u0001+\u0001+\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001"+ + ".\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u0001"+ + "0\u00010\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0001"+ + "3\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ + "5\u00015\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u0001"+ + "8\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u00019\u0001:\u0001"+ + ":\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001"+ + "<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001>\u0004>\u04c3\b>\u000b"+ + ">\f>\u04c4\u0001>\u0001>\u0003>\u04c9\b>\u0001>\u0004>\u04cc\b>\u000b"+ + ">\f>\u04cd\u0001?\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001@\u0001"+ + "A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001B\u0001C\u0001C\u0001"+ + "C\u0001C\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001F\u0001F\u0001F\u0001F\u0001G\u0001"+ + "G\u0001G\u0001G\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ + "I\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001L\u0001"+ + "L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001"+ + "N\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ + "S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "V\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+ + "X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001[\u0001[\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001^\u0001^\u0001"+ + "_\u0001_\u0003_\u0552\b_\u0001_\u0004_\u0555\b_\u000b_\f_\u0556\u0001"+ + "`\u0001`\u0001a\u0001a\u0001b\u0001b\u0001b\u0003b\u0560\bb\u0001c\u0001"+ + "c\u0001d\u0001d\u0001d\u0003d\u0567\bd\u0001e\u0001e\u0001e\u0005e\u056c"+ + "\be\ne\fe\u056f\te\u0001e\u0001e\u0001e\u0001e\u0001e\u0001e\u0005e\u0577"+ + "\be\ne\fe\u057a\te\u0001e\u0001e\u0001e\u0001e\u0001e\u0003e\u0581\be"+ + "\u0001e\u0003e\u0584\be\u0003e\u0586\be\u0001f\u0004f\u0589\bf\u000bf"+ + "\ff\u058a\u0001g\u0004g\u058e\bg\u000bg\fg\u058f\u0001g\u0001g\u0005g"+ + "\u0594\bg\ng\fg\u0597\tg\u0001g\u0001g\u0004g\u059b\bg\u000bg\fg\u059c"+ + "\u0001g\u0004g\u05a0\bg\u000bg\fg\u05a1\u0001g\u0001g\u0005g\u05a6\bg"+ + "\ng\fg\u05a9\tg\u0003g\u05ab\bg\u0001g\u0001g\u0001g\u0001g\u0004g\u05b1"+ + "\bg\u000bg\fg\u05b2\u0001g\u0001g\u0003g\u05b7\bg\u0001h\u0001h\u0001"+ + "h\u0001h\u0001i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001"+ + "k\u0001l\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001o\u0001o\u0001"+ + "p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001r\u0001r\u0001r\u0001"+ + "r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001s\u0001s\u0001t\u0001"+ + "t\u0001t\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001v\u0001"+ + "w\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001y\u0001"+ + "y\u0001y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001"+ + "{\u0001{\u0001{\u0001|\u0001|\u0001|\u0001}\u0001}\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f"+ + "\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080"+ + "\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082"+ + "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0085"+ + "\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087"+ + "\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u008a"+ + "\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008d"+ + "\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0003\u0091\u0644\b\u0091\u0001\u0091\u0005\u0091\u0647\b"+ + "\u0091\n\u0091\f\u0091\u064a\t\u0091\u0001\u0091\u0001\u0091\u0004\u0091"+ + "\u064e\b\u0091\u000b\u0091\f\u0091\u064f\u0003\u0091\u0652\b\u0091\u0001"+ + "\u0092\u0001\u0092\u0001\u0092\u0003\u0092\u0657\b\u0092\u0001\u0092\u0005"+ + "\u0092\u065a\b\u0092\n\u0092\f\u0092\u065d\t\u0092\u0001\u0092\u0001\u0092"+ + "\u0004\u0092\u0661\b\u0092\u000b\u0092\f\u0092\u0662\u0003\u0092\u0665"+ + "\b\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ + "\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001"+ + "\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0005\u0097\u067d"+ + "\b\u0097\n\u0097\f\u0097\u0680\t\u0097\u0001\u0097\u0001\u0097\u0003\u0097"+ + "\u0684\b\u0097\u0001\u0097\u0004\u0097\u0687\b\u0097\u000b\u0097\f\u0097"+ + "\u0688\u0003\u0097\u068b\b\u0097\u0001\u0098\u0001\u0098\u0004\u0098\u068f"+ + "\b\u0098\u000b\u0098\f\u0098\u0690\u0001\u0098\u0001\u0098\u0001\u0099"+ + "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c"+ + "\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ + "\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0003\u00a8"+ + "\u06dd\b\u00a8\u0001\u00a9\u0004\u00a9\u06e0\b\u00a9\u000b\u00a9\f\u00a9"+ + "\u06e1\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+ + "\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001"+ + "\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ + "\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001"+ + "\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001"+ + "\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001"+ + "\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001"+ + "\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+ + "\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001"+ + "\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001"+ + "\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001"+ + "\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+ + "\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001"+ + "\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001"+ + "\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001"+ + "\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001"+ + "\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001"+ + "\u00c4\u0001\u00c4\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001"+ + "\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7\u0001"+ + "\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001"+ + "\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001"+ + "\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001"+ + "\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001"+ + "\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cd\u0001"+ + "\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001"+ + "\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001"+ + "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001"+ + "\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d1\u0001\u00d1\u0001"+ + "\u00d1\u0001\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001"+ + "\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001\u00d4\u0001"+ + "\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001"+ + "\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d7\u0001"+ + "\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d8\u0001"+ + "\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001"+ + "\u00d9\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00db\u0001"+ + "\u00db\u0001\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001"+ + "\u00dc\u0001\u00dc\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001"+ + "\u00de\u0001\u00de\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001"+ + "\u00df\u0001\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001"+ + "\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e1\u0001"+ + "\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001"+ + "\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e4\u0001"+ + "\u00e4\u0001\u00e4\u0001\u00e4\u0001\u00e5\u0001\u00e5\u0001\u00e5\u0001"+ + "\u00e5\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e6\u0001\u00e7\u0001"+ + "\u00e7\u0001\u00e7\u0001\u00e7\u0001\u00e8\u0001\u00e8\u0001\u00e8\u0001"+ + "\u00e8\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001\u00e9\u0001"+ + "\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00ea\u0001\u00eb\u0001\u00eb\u0001"+ + "\u00eb\u0001\u00eb\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001\u00ec\u0001"+ + "\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ed\u0001\u00ee\u0001\u00ee\u0001"+ + "\u00ee\u0001\u00ee\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001\u00ef\u0001"+ + "\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f0\u0001\u00f1\u0001\u00f1\u0001"+ + "\u00f1\u0001\u00f1\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001\u00f2\u0001"+ + "\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f3\u0001\u00f4\u0001\u00f4\u0001"+ + "\u00f4\u0001\u00f4\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001\u00f5\u0001"+ + "\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f6\u0001\u00f7\u0001\u00f7\u0001"+ + "\u00f7\u0001\u00f7\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001\u00f8\u0001"+ + "\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00f9\u0001\u00fa\u0001\u00fa\u0001"+ + "\u00fa\u0001\u00fa\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001\u00fb\u0001"+ + "\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fc\u0001\u00fd\u0001"+ + "\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fd\u0001\u00fe\u0001"+ + "\u00fe\u0001\u00fe\u0001\u00fe\u0001\u00ff\u0001\u00ff\u0001\u00ff\u0001"+ + "\u00ff\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0100\u0001\u0101\u0001"+ + "\u0101\u0001\u0101\u0001\u0101\u0001\u0102\u0001\u0102\u0001\u0102\u0001"+ + "\u0102\u0001\u0103\u0001\u0103\u0001\u0103\u0001\u0103\u0001\u0104\u0001"+ + "\u0104\u0001\u0104\u0001\u0104\u0001\u0105\u0001\u0105\u0001\u0105\u0001"+ + "\u0105\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0106\u0001\u0107\u0001"+ + "\u0107\u0001\u0107\u0001\u0107\u0001\u0108\u0001\u0108\u0001\u0108\u0001"+ + "\u0108\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u0109\u0001\u010a\u0001"+ + "\u010a\u0001\u010a\u0001\u010a\u0001\u010a\u0001\u010b\u0001\u010b\u0001"+ + "\u010b\u0001\u010b\u0001\u010b\u0001\u010b\u0001\u010c\u0001\u010c\u0001"+ + "\u010c\u0001\u010c\u0001\u010d\u0001\u010d\u0001\u010d\u0001\u010d\u0001"+ + "\u010e\u0001\u010e\u0001\u010e\u0001\u010e\u0001\u010f\u0001\u010f\u0001"+ + "\u010f\u0001\u010f\u0001\u0110\u0001\u0110\u0001\u0110\u0001\u0110\u0001"+ + "\u0111\u0001\u0111\u0001\u0111\u0001\u0111\u0001\u0112\u0001\u0112\u0001"+ + "\u0112\u0001\u0112\u0001\u0113\u0001\u0113\u0001\u0113\u0001\u0113\u0001"+ + "\u0114\u0001\u0114\u0001\u0114\u0001\u0114\u0003\u0114\u08bb\b\u0114\u0001"+ + "\u0115\u0001\u0115\u0003\u0115\u08bf\b\u0115\u0001\u0115\u0005\u0115\u08c2"+ + "\b\u0115\n\u0115\f\u0115\u08c5\t\u0115\u0001\u0115\u0001\u0115\u0003\u0115"+ + "\u08c9\b\u0115\u0001\u0115\u0004\u0115\u08cc\b\u0115\u000b\u0115\f\u0115"+ + "\u08cd\u0003\u0115\u08d0\b\u0115\u0001\u0116\u0001\u0116\u0004\u0116\u08d4"+ + "\b\u0116\u000b\u0116\f\u0116\u08d5\u0001\u0117\u0001\u0117\u0001\u0117"+ + "\u0001\u0117\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0118\u0001\u0119"+ + "\u0001\u0119\u0001\u0119\u0001\u0119\u0001\u011a\u0001\u011a\u0001\u011a"+ + "\u0001\u011a\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011b\u0001\u011c"+ + "\u0001\u011c\u0001\u011c\u0001\u011c\u0001\u011d\u0001\u011d\u0001\u011d"+ + "\u0001\u011d\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011e\u0001\u011f"+ + "\u0001\u011f\u0001\u011f\u0001\u011f\u0001\u0120\u0001\u0120\u0001\u0120"+ + "\u0001\u0120\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0121\u0001\u0122"+ + "\u0001\u0122\u0001\u0122\u0001\u0122\u0001\u0123\u0001\u0123\u0001\u0123"+ + "\u0001\u0123\u0001\u0123\u0001\u0124\u0001\u0124\u0001\u0124\u0001\u0124"+ "\u0001\u0124\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125\u0001\u0125"+ - "\u0001\u0125\u0001\u0125\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126"+ - "\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0128\u0001\u0128"+ - "\u0001\u0128\u0001\u0128\u0001\u0129\u0001\u0129\u0005\u0129\u091e\b\u0129"+ - "\n\u0129\f\u0129\u0921\t\u0129\u0001\u0129\u0003\u0129\u0924\b\u0129\u0001"+ - "\u0129\u0003\u0129\u0927\b\u0129\u0001\u012a\u0001\u012a\u0001\u012a\u0001"+ - "\u012a\u0005\u012a\u092d\b\u012a\n\u012a\f\u012a\u0930\t\u012a\u0001\u012a"+ - "\u0001\u012a\u0001\u012b\u0001\u012b\u0001\u012c\u0001\u012c\u0001\u012c"+ - "\u0001\u012c\u0001\u012c\u0001\u012d\u0001\u012d\u0001\u012d\u0001\u012d"+ + "\u0001\u0125\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126\u0001\u0126"+ + "\u0001\u0126\u0001\u0126\u0001\u0127\u0001\u0127\u0001\u0127\u0001\u0127"+ + "\u0001\u0128\u0001\u0128\u0001\u0128\u0001\u0128\u0001\u0129\u0001\u0129"+ + "\u0001\u0129\u0001\u0129\u0001\u012a\u0001\u012a\u0005\u012a\u092d\b\u012a"+ + "\n\u012a\f\u012a\u0930\t\u012a\u0001\u012a\u0003\u012a\u0933\b\u012a\u0001"+ + "\u012a\u0003\u012a\u0936\b\u012a\u0001\u012b\u0001\u012b\u0001\u012b\u0001"+ + "\u012b\u0005\u012b\u093c\b\u012b\n\u012b\f\u012b\u093f\t\u012b\u0001\u012b"+ + "\u0001\u012b\u0001\u012c\u0001\u012c\u0001\u012d\u0001\u012d\u0001\u012d"+ "\u0001\u012d\u0001\u012d\u0001\u012e\u0001\u012e\u0001\u012e\u0001\u012e"+ - "\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u0130\u0001\u0130"+ - "\u0001\u0130\u0001\u0130\u0001\u0131\u0001\u0131\u0001\u0131\u0001\u0131"+ - "\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0133\u0001\u0133"+ - "\u0001\u0133\u0001\u0133\u0001\u0134\u0001\u0134\u0001\u0134\u0001\u0134"+ - "\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0136\u0001\u0136"+ - "\u0001\u0136\u0001\u0136\u0001\u0137\u0001\u0137\u0001\u0137\u0001\u0138"+ - "\u0001\u0138\u0001\u0138\u0001\u0138\u0001\u0139\u0001\u0139\u0001\u0139"+ - "\u0001\u0139\u0001\u013a\u0001\u013a\u0001\u013a\u0001\u013a\u0001\u013b"+ - "\u0001\u013b\u0001\u013b\u0001\u013b\u0001\u013c\u0001\u013c\u0001\u013c"+ - "\u0001\u013c\u0001\u013d\u0001\u013d\u0001\u013d\u0001\u013d\u0001\u013e"+ - "\u0001\u013e\u0001\u013e\u0001\u013e\u0001\u013f\u0001\u013f\u0001\u013f"+ - "\u0001\u013f\u0001\u013f\u0001\u0140\u0001\u0140\u0001\u0140\u0001\u0140"+ - "\u0001\u0141\u0001\u0141\u0001\u0141\u0001\u0141\u0001\u0142\u0001\u0142"+ - "\u0001\u0142\u0001\u0142\u0001\u0143\u0001\u0143\u0001\u0143\u0001\u0143"+ - "\u0001\u0144\u0001\u0144\u0001\u0144\u0001\u0144\u0001\u0145\u0001\u0145"+ - "\u0001\u0145\u0001\u0145\u0001\u0146\u0001\u0146\u0001\u0146\u0001\u0146"+ - "\u0001\u0147\u0001\u0147\u0001\u0147\u0001\u0147\u0001\u0148\u0001\u0148"+ - "\u0001\u0148\u0001\u0148\u0001\u0149\u0001\u0149\u0001\u0149\u0001\u0149"+ - "\u0001\u014a\u0001\u014a\u0001\u014a\u0001\u014a\u0001\u014b\u0001\u014b"+ - "\u0001\u014b\u0001\u014b\u0001\u014c\u0001\u014c\u0001\u014c\u0001\u014c"+ - "\u0001\u014d\u0001\u014d\u0001\u014d\u0001\u014d\u0001\u014e\u0001\u014e"+ - "\u0001\u014e\u0001\u014e\u0001\u014f\u0001\u014f\u0001\u014f\u0001\u014f"+ - "\u0001\u0150\u0001\u0150\u0001\u0150\u0001\u0150\u0001\u0151\u0001\u0151"+ - "\u0001\u0151\u0001\u0151\u0001\u0152\u0001\u0152\u0001\u0152\u0001\u0152"+ - "\u0001\u0153\u0001\u0153\u0001\u0153\u0001\u0153\u0001\u0154\u0001\u0154"+ - "\u0001\u0154\u0001\u0154\u0001\u0155\u0001\u0155\u0001\u0155\u0001\u0155"+ - "\u0001\u0155\u0001\u0156\u0001\u0156\u0001\u0156\u0001\u0156\u0001\u0156"+ - "\u0001\u0157\u0001\u0157\u0001\u0157\u0001\u0157\u0001\u0158\u0001\u0158"+ - "\u0001\u0158\u0001\u0158\u0001\u0159\u0001\u0159\u0001\u0159\u0001\u0159"+ - "\u0002\u02e0\u0569\u0000\u015a\u0014\u0001\u0016\u0002\u0018\u0003\u001a"+ + "\u0001\u012e\u0001\u012e\u0001\u012f\u0001\u012f\u0001\u012f\u0001\u012f"+ + "\u0001\u0130\u0001\u0130\u0001\u0130\u0001\u0130\u0001\u0131\u0001\u0131"+ + "\u0001\u0131\u0001\u0131\u0001\u0132\u0001\u0132\u0001\u0132\u0001\u0132"+ + "\u0001\u0133\u0001\u0133\u0001\u0133\u0001\u0133\u0001\u0134\u0001\u0134"+ + "\u0001\u0134\u0001\u0134\u0001\u0135\u0001\u0135\u0001\u0135\u0001\u0135"+ + "\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0136\u0001\u0137\u0001\u0137"+ + "\u0001\u0137\u0001\u0137\u0001\u0138\u0001\u0138\u0001\u0138\u0001\u0139"+ + "\u0001\u0139\u0001\u0139\u0001\u0139\u0001\u013a\u0001\u013a\u0001\u013a"+ + "\u0001\u013a\u0001\u013b\u0001\u013b\u0001\u013b\u0001\u013b\u0001\u013c"+ + "\u0001\u013c\u0001\u013c\u0001\u013c\u0001\u013d\u0001\u013d\u0001\u013d"+ + "\u0001\u013d\u0001\u013e\u0001\u013e\u0001\u013e\u0001\u013e\u0001\u013f"+ + "\u0001\u013f\u0001\u013f\u0001\u013f\u0001\u0140\u0001\u0140\u0001\u0140"+ + "\u0001\u0140\u0001\u0140\u0001\u0141\u0001\u0141\u0001\u0141\u0001\u0141"+ + "\u0001\u0142\u0001\u0142\u0001\u0142\u0001\u0142\u0001\u0143\u0001\u0143"+ + "\u0001\u0143\u0001\u0143\u0001\u0144\u0001\u0144\u0001\u0144\u0001\u0144"+ + "\u0001\u0145\u0001\u0145\u0001\u0145\u0001\u0145\u0001\u0146\u0001\u0146"+ + "\u0001\u0146\u0001\u0146\u0001\u0147\u0001\u0147\u0001\u0147\u0001\u0147"+ + "\u0001\u0148\u0001\u0148\u0001\u0148\u0001\u0148\u0001\u0149\u0001\u0149"+ + "\u0001\u0149\u0001\u0149\u0001\u014a\u0001\u014a\u0001\u014a\u0001\u014a"+ + "\u0001\u014b\u0001\u014b\u0001\u014b\u0001\u014b\u0001\u014c\u0001\u014c"+ + "\u0001\u014c\u0001\u014c\u0001\u014d\u0001\u014d\u0001\u014d\u0001\u014d"+ + "\u0001\u014e\u0001\u014e\u0001\u014e\u0001\u014e\u0001\u014f\u0001\u014f"+ + "\u0001\u014f\u0001\u014f\u0001\u0150\u0001\u0150\u0001\u0150\u0001\u0150"+ + "\u0001\u0151\u0001\u0151\u0001\u0151\u0001\u0151\u0001\u0152\u0001\u0152"+ + "\u0001\u0152\u0001\u0152\u0001\u0153\u0001\u0153\u0001\u0153\u0001\u0153"+ + "\u0001\u0154\u0001\u0154\u0001\u0154\u0001\u0154\u0001\u0155\u0001\u0155"+ + "\u0001\u0155\u0001\u0155\u0001\u0156\u0001\u0156\u0001\u0156\u0001\u0156"+ + "\u0001\u0156\u0001\u0157\u0001\u0157\u0001\u0157\u0001\u0157\u0001\u0157"+ + "\u0001\u0158\u0001\u0158\u0001\u0158\u0001\u0158\u0001\u0159\u0001\u0159"+ + "\u0001\u0159\u0001\u0159\u0001\u015a\u0001\u015a\u0001\u015a\u0001\u015a"+ + "\u0002\u02e2\u0578\u0000\u015b\u0014\u0001\u0016\u0002\u0018\u0003\u001a"+ "\u0004\u001c\u0005\u001e\u0006 \u0007\"\b$\t&\n(\u000b*\f,\r.\u000e0\u000f"+ "2\u00104\u00116\u00128\u0013:\u0014<\u0015>\u0016@\u0017B\u0018D\u0019"+ "F\u001aH\u001bJ\u001cL\u001dN\u001eP\u001fR T!V\"X#Z$\\%^&`\'b(d)f*h+"+ - "j\u0000l\u0000n\u0000p\u0000r\u0000t\u0000v\u0000x\u0000z\u0000|\u0000"+ - "~,\u0080-\u0082.\u0084\u0000\u0086\u0000\u0088\u0000\u008a\u0000\u008c"+ - "\u0000\u008e/\u0090\u0000\u0092\u0000\u00940\u00961\u00982\u009a\u0000"+ - "\u009c\u0000\u009e\u0000\u00a0\u0000\u00a2\u0000\u00a4\u0000\u00a6\u0000"+ - "\u00a8\u0000\u00aa\u0000\u00ac\u0000\u00ae\u0000\u00b0\u0000\u00b2\u0000"+ - "\u00b4\u0000\u00b63\u00b84\u00ba5\u00bc\u0000\u00be\u0000\u00c06\u00c2"+ - "7\u00c48\u00c69\u00c8\u0000\u00ca\u0000\u00cc\u0000\u00ce\u0000\u00d0"+ - "\u0000\u00d2\u0000\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dc"+ - ":\u00de;\u00e0<\u00e2=\u00e4>\u00e6?\u00e8@\u00eaA\u00ecB\u00eeC\u00f0"+ + "j,l\u0000n\u0000p\u0000r\u0000t\u0000v\u0000x\u0000z\u0000|\u0000~\u0000"+ + "\u0080-\u0082.\u0084/\u0086\u0000\u0088\u0000\u008a\u0000\u008c\u0000"+ + "\u008e\u0000\u00900\u0092\u0000\u0094\u0000\u00961\u00982\u009a3\u009c"+ + "\u0000\u009e\u0000\u00a0\u0000\u00a2\u0000\u00a4\u0000\u00a6\u0000\u00a8"+ + "\u0000\u00aa\u0000\u00ac\u0000\u00ae\u0000\u00b0\u0000\u00b2\u0000\u00b4"+ + "\u0000\u00b6\u0000\u00b84\u00ba5\u00bc6\u00be\u0000\u00c0\u0000\u00c2"+ + "7\u00c48\u00c69\u00c8:\u00ca\u0000\u00cc\u0000\u00ce\u0000\u00d0\u0000"+ + "\u00d2\u0000\u00d4\u0000\u00d6\u0000\u00d8\u0000\u00da\u0000\u00dc\u0000"+ + "\u00de;\u00e0<\u00e2=\u00e4>\u00e6?\u00e8@\u00eaA\u00ecB\u00eeC\u00f0"+ "D\u00f2E\u00f4F\u00f6G\u00f8H\u00faI\u00fcJ\u00feK\u0100L\u0102M\u0104"+ "N\u0106O\u0108P\u010aQ\u010cR\u010eS\u0110T\u0112U\u0114V\u0116W\u0118"+ "X\u011aY\u011cZ\u011e[\u0120\\\u0122]\u0124^\u0126_\u0128`\u012aa\u012c"+ - "b\u012ec\u0130d\u0132\u0000\u0134e\u0136f\u0138g\u013ah\u013ci\u013ej"+ - "\u0140k\u0142\u0000\u0144l\u0146m\u0148n\u014ao\u014c\u0000\u014e\u0000"+ - "\u0150\u0000\u0152\u0000\u0154\u0000\u0156p\u0158\u0000\u015a\u0000\u015c"+ - "\u0000\u015e\u0000\u0160\u0000\u0162\u0000\u0164q\u0166\u0000\u0168\u0000"+ - "\u016ar\u016cs\u016et\u0170\u0000\u0172\u0000\u0174\u0000\u0176u\u0178"+ - "v\u017aw\u017c\u0000\u017e\u0000\u0180x\u0182y\u0184z\u0186\u0000\u0188"+ - "\u0000\u018a\u0000\u018c\u0000\u018e\u0000\u0190\u0000\u0192\u0000\u0194"+ - "\u0000\u0196\u0000\u0198\u0000\u019a{\u019c|\u019e}\u01a0~\u01a2\u007f"+ - "\u01a4\u0080\u01a6\u0081\u01a8\u0000\u01aa\u0082\u01ac\u0000\u01ae\u0000"+ - "\u01b0\u0083\u01b2\u0000\u01b4\u0000\u01b6\u0000\u01b8\u0084\u01ba\u0085"+ - "\u01bc\u0086\u01be\u0000\u01c0\u0000\u01c2\u0000\u01c4\u0000\u01c6\u0000"+ - "\u01c8\u0000\u01ca\u0000\u01cc\u0000\u01ce\u0087\u01d0\u0088\u01d2\u0089"+ - "\u01d4\u0000\u01d6\u0000\u01d8\u0000\u01da\u0000\u01dc\u0000\u01de\u008a"+ - "\u01e0\u008b\u01e2\u008c\u01e4\u008d\u01e6\u0000\u01e8\u0000\u01ea\u0000"+ + "b\u012ec\u0130d\u0132e\u0134\u0000\u0136f\u0138g\u013ah\u013ci\u013ej"+ + "\u0140k\u0142l\u0144\u0000\u0146m\u0148n\u014ao\u014cp\u014e\u0000\u0150"+ + "\u0000\u0152\u0000\u0154\u0000\u0156\u0000\u0158q\u015a\u0000\u015c\u0000"+ + "\u015e\u0000\u0160\u0000\u0162\u0000\u0164\u0000\u0166r\u0168\u0000\u016a"+ + "\u0000\u016cs\u016et\u0170u\u0172\u0000\u0174\u0000\u0176\u0000\u0178"+ + "v\u017aw\u017cx\u017e\u0000\u0180\u0000\u0182y\u0184z\u0186{\u0188\u0000"+ + "\u018a\u0000\u018c\u0000\u018e\u0000\u0190\u0000\u0192\u0000\u0194\u0000"+ + "\u0196\u0000\u0198\u0000\u019a\u0000\u019c|\u019e}\u01a0~\u01a2\u007f"+ + "\u01a4\u0080\u01a6\u0081\u01a8\u0082\u01aa\u0000\u01ac\u0083\u01ae\u0000"+ + "\u01b0\u0000\u01b2\u0084\u01b4\u0000\u01b6\u0000\u01b8\u0000\u01ba\u0085"+ + "\u01bc\u0086\u01be\u0087\u01c0\u0000\u01c2\u0000\u01c4\u0000\u01c6\u0000"+ + "\u01c8\u0000\u01ca\u0000\u01cc\u0000\u01ce\u0000\u01d0\u0088\u01d2\u0089"+ + "\u01d4\u008a\u01d6\u0000\u01d8\u0000\u01da\u0000\u01dc\u0000\u01de\u0000"+ + "\u01e0\u008b\u01e2\u008c\u01e4\u008d\u01e6\u008e\u01e8\u0000\u01ea\u0000"+ "\u01ec\u0000\u01ee\u0000\u01f0\u0000\u01f2\u0000\u01f4\u0000\u01f6\u0000"+ "\u01f8\u0000\u01fa\u0000\u01fc\u0000\u01fe\u0000\u0200\u0000\u0202\u0000"+ - "\u0204\u008e\u0206\u008f\u0208\u0090\u020a\u0000\u020c\u0000\u020e\u0000"+ + "\u0204\u0000\u0206\u008f\u0208\u0090\u020a\u0091\u020c\u0000\u020e\u0000"+ "\u0210\u0000\u0212\u0000\u0214\u0000\u0216\u0000\u0218\u0000\u021a\u0000"+ - "\u021c\u0000\u021e\u0000\u0220\u0091\u0222\u0092\u0224\u0093\u0226\u0000"+ + "\u021c\u0000\u021e\u0000\u0220\u0000\u0222\u0092\u0224\u0093\u0226\u0094"+ "\u0228\u0000\u022a\u0000\u022c\u0000\u022e\u0000\u0230\u0000\u0232\u0000"+ - "\u0234\u0000\u0236\u0000\u0238\u0000\u023a\u0000\u023c\u0000\u023e\u0094"+ - "\u0240\u0095\u0242\u0096\u0244\u0097\u0246\u0000\u0248\u0000\u024a\u0000"+ + "\u0234\u0000\u0236\u0000\u0238\u0000\u023a\u0000\u023c\u0000\u023e\u0000"+ + "\u0240\u0095\u0242\u0096\u0244\u0097\u0246\u0098\u0248\u0000\u024a\u0000"+ "\u024c\u0000\u024e\u0000\u0250\u0000\u0252\u0000\u0254\u0000\u0256\u0000"+ - "\u0258\u0000\u025a\u0000\u025c\u0000\u025e\u0000\u0260\u0098\u0262\u0099"+ - "\u0264\u009a\u0266\u009b\u0268\u009c\u026a\u009d\u026c\u0000\u026e\u0000"+ + "\u0258\u0000\u025a\u0000\u025c\u0000\u025e\u0000\u0260\u0000\u0262\u0099"+ + "\u0264\u009a\u0266\u009b\u0268\u009c\u026a\u009d\u026c\u009e\u026e\u0000"+ "\u0270\u0000\u0272\u0000\u0274\u0000\u0276\u0000\u0278\u0000\u027a\u0000"+ - "\u027c\u0000\u027e\u0000\u0280\u0000\u0282\u009e\u0284\u0000\u0286\u009f"+ - "\u0288\u00a0\u028a\u00a1\u028c\u0000\u028e\u0000\u0290\u0000\u0292\u0000"+ + "\u027c\u0000\u027e\u0000\u0280\u0000\u0282\u0000\u0284\u009f\u0286\u0000"+ + "\u0288\u00a0\u028a\u00a1\u028c\u00a2\u028e\u0000\u0290\u0000\u0292\u0000"+ "\u0294\u0000\u0296\u0000\u0298\u0000\u029a\u0000\u029c\u0000\u029e\u0000"+ "\u02a0\u0000\u02a2\u0000\u02a4\u0000\u02a6\u0000\u02a8\u0000\u02aa\u0000"+ "\u02ac\u0000\u02ae\u0000\u02b0\u0000\u02b2\u0000\u02b4\u0000\u02b6\u0000"+ - "\u02b8\u00a2\u02ba\u00a3\u02bc\u00a4\u02be\u0000\u02c0\u00a5\u02c2\u00a6"+ - "\u02c4\u00a7\u02c6\u00a8\u0014\u0000\u0001\u0002\u0003\u0004\u0005\u0006"+ - "\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\'\u0002\u0000"+ - "\n\n\r\r\u0003\u0000\t\n\r\r \u0002\u0000CCcc\u0002\u0000HHhh\u0002\u0000"+ - "AAaa\u0002\u0000NNnn\u0002\u0000GGgg\u0002\u0000EEee\u0002\u0000PPpp\u0002"+ - "\u0000OOoo\u0002\u0000IIii\u0002\u0000TTtt\u0002\u0000RRrr\u0002\u0000"+ - "XXxx\u0002\u0000LLll\u0002\u0000MMmm\u0002\u0000DDdd\u0002\u0000SSss\u0002"+ - "\u0000VVvv\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000UUuu\u0002\u0000"+ - "FFff\u0002\u0000QQqq\u0006\u0000\t\n\r\r //[[]]\f\u0000\t\n\r\r \"#"+ - "(),,//::<<>?\\\\||\u0001\u000009\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\"+ - "nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001\u0000``\u0002"+ - "\u0000BBbb\u0002\u0000YYyy\f\u0000\t\n\r\r \"\"(),,//::==[[]]||\u0002"+ - "\u0000**//\u0002\u0000JJjj\u0002\u0000\'\'\\\\\u0007\u0000\n\n\r\r \""+ - "#\')``||\u0a0d\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000"+ - "\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000"+ - "\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000"+ - "\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000"+ - "\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000"+ - "(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001"+ - "\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000"+ - "\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u0000"+ - "6\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001"+ - "\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000"+ - "\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000\u0000\u0000"+ - "D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000H\u0001"+ - "\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001\u0000\u0000"+ - "\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000\u0000\u0000"+ - "R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000V\u0001"+ - "\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001\u0000\u0000"+ - "\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000\u0000\u0000"+ - "\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000\u0000d"+ - "\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h\u0001\u0000"+ - "\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000"+ - "\u0001n\u0001\u0000\u0000\u0000\u0001p\u0001\u0000\u0000\u0000\u0001r"+ - "\u0001\u0000\u0000\u0000\u0001t\u0001\u0000\u0000\u0000\u0001v\u0001\u0000"+ - "\u0000\u0000\u0001x\u0001\u0000\u0000\u0000\u0001z\u0001\u0000\u0000\u0000"+ - "\u0001|\u0001\u0000\u0000\u0000\u0001~\u0001\u0000\u0000\u0000\u0001\u0080"+ - "\u0001\u0000\u0000\u0000\u0001\u0082\u0001\u0000\u0000\u0000\u0002\u0084"+ - "\u0001\u0000\u0000\u0000\u0002\u0086\u0001\u0000\u0000\u0000\u0002\u0088"+ - "\u0001\u0000\u0000\u0000\u0002\u008a\u0001\u0000\u0000\u0000\u0002\u008e"+ - "\u0001\u0000\u0000\u0000\u0002\u0090\u0001\u0000\u0000\u0000\u0002\u0092"+ - "\u0001\u0000\u0000\u0000\u0002\u0094\u0001\u0000\u0000\u0000\u0002\u0096"+ - "\u0001\u0000\u0000\u0000\u0002\u0098\u0001\u0000\u0000\u0000\u0003\u009a"+ - "\u0001\u0000\u0000\u0000\u0003\u009c\u0001\u0000\u0000\u0000\u0003\u009e"+ - "\u0001\u0000\u0000\u0000\u0003\u00a0\u0001\u0000\u0000\u0000\u0003\u00a2"+ - "\u0001\u0000\u0000\u0000\u0003\u00a4\u0001\u0000\u0000\u0000\u0003\u00a6"+ - "\u0001\u0000\u0000\u0000\u0003\u00a8\u0001\u0000\u0000\u0000\u0003\u00aa"+ - "\u0001\u0000\u0000\u0000\u0003\u00ac\u0001\u0000\u0000\u0000\u0003\u00ae"+ - "\u0001\u0000\u0000\u0000\u0003\u00b0\u0001\u0000\u0000\u0000\u0003\u00b2"+ - "\u0001\u0000\u0000\u0000\u0003\u00b4\u0001\u0000\u0000\u0000\u0003\u00b6"+ - "\u0001\u0000\u0000\u0000\u0003\u00b8\u0001\u0000\u0000\u0000\u0003\u00ba"+ - "\u0001\u0000\u0000\u0000\u0004\u00bc\u0001\u0000\u0000\u0000\u0004\u00be"+ - "\u0001\u0000\u0000\u0000\u0004\u00c0\u0001\u0000\u0000\u0000\u0004\u00c2"+ - "\u0001\u0000\u0000\u0000\u0004\u00c4\u0001\u0000\u0000\u0000\u0005\u00c6"+ - "\u0001\u0000\u0000\u0000\u0005\u00dc\u0001\u0000\u0000\u0000\u0005\u00de"+ - "\u0001\u0000\u0000\u0000\u0005\u00e0\u0001\u0000\u0000\u0000\u0005\u00e2"+ - "\u0001\u0000\u0000\u0000\u0005\u00e4\u0001\u0000\u0000\u0000\u0005\u00e6"+ - "\u0001\u0000\u0000\u0000\u0005\u00e8\u0001\u0000\u0000\u0000\u0005\u00ea"+ - "\u0001\u0000\u0000\u0000\u0005\u00ec\u0001\u0000\u0000\u0000\u0005\u00ee"+ - "\u0001\u0000\u0000\u0000\u0005\u00f0\u0001\u0000\u0000\u0000\u0005\u00f2"+ - "\u0001\u0000\u0000\u0000\u0005\u00f4\u0001\u0000\u0000\u0000\u0005\u00f6"+ - "\u0001\u0000\u0000\u0000\u0005\u00f8\u0001\u0000\u0000\u0000\u0005\u00fa"+ - "\u0001\u0000\u0000\u0000\u0005\u00fc\u0001\u0000\u0000\u0000\u0005\u00fe"+ - "\u0001\u0000\u0000\u0000\u0005\u0100\u0001\u0000\u0000\u0000\u0005\u0102"+ - "\u0001\u0000\u0000\u0000\u0005\u0104\u0001\u0000\u0000\u0000\u0005\u0106"+ - "\u0001\u0000\u0000\u0000\u0005\u0108\u0001\u0000\u0000\u0000\u0005\u010a"+ - "\u0001\u0000\u0000\u0000\u0005\u010c\u0001\u0000\u0000\u0000\u0005\u010e"+ - "\u0001\u0000\u0000\u0000\u0005\u0110\u0001\u0000\u0000\u0000\u0005\u0112"+ - "\u0001\u0000\u0000\u0000\u0005\u0114\u0001\u0000\u0000\u0000\u0005\u0116"+ - "\u0001\u0000\u0000\u0000\u0005\u0118\u0001\u0000\u0000\u0000\u0005\u011a"+ - "\u0001\u0000\u0000\u0000\u0005\u011c\u0001\u0000\u0000\u0000\u0005\u011e"+ - "\u0001\u0000\u0000\u0000\u0005\u0120\u0001\u0000\u0000\u0000\u0005\u0122"+ - "\u0001\u0000\u0000\u0000\u0005\u0124\u0001\u0000\u0000\u0000\u0005\u0126"+ - "\u0001\u0000\u0000\u0000\u0005\u0128\u0001\u0000\u0000\u0000\u0005\u012a"+ - "\u0001\u0000\u0000\u0000\u0005\u012c\u0001\u0000\u0000\u0000\u0005\u012e"+ - "\u0001\u0000\u0000\u0000\u0005\u0130\u0001\u0000\u0000\u0000\u0005\u0132"+ - "\u0001\u0000\u0000\u0000\u0005\u0134\u0001\u0000\u0000\u0000\u0005\u0136"+ - "\u0001\u0000\u0000\u0000\u0005\u0138\u0001\u0000\u0000\u0000\u0005\u013a"+ - "\u0001\u0000\u0000\u0000\u0005\u013c\u0001\u0000\u0000\u0000\u0005\u013e"+ - "\u0001\u0000\u0000\u0000\u0005\u0140\u0001\u0000\u0000\u0000\u0005\u0144"+ - "\u0001\u0000\u0000\u0000\u0005\u0146\u0001\u0000\u0000\u0000\u0005\u0148"+ - "\u0001\u0000\u0000\u0000\u0005\u014a\u0001\u0000\u0000\u0000\u0006\u014c"+ - "\u0001\u0000\u0000\u0000\u0006\u014e\u0001\u0000\u0000\u0000\u0006\u0150"+ - "\u0001\u0000\u0000\u0000\u0006\u0152\u0001\u0000\u0000\u0000\u0006\u0154"+ - "\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000\u0006\u0158"+ - "\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000\u0006\u015c"+ - "\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000\u0006\u0160"+ - "\u0001\u0000\u0000\u0000\u0006\u0164\u0001\u0000\u0000\u0000\u0006\u0166"+ - "\u0001\u0000\u0000\u0000\u0006\u0168\u0001\u0000\u0000\u0000\u0006\u016a"+ - "\u0001\u0000\u0000\u0000\u0006\u016c\u0001\u0000\u0000\u0000\u0006\u016e"+ - "\u0001\u0000\u0000\u0000\u0007\u0170\u0001\u0000\u0000\u0000\u0007\u0172"+ - "\u0001\u0000\u0000\u0000\u0007\u0174\u0001\u0000\u0000\u0000\u0007\u0176"+ - "\u0001\u0000\u0000\u0000\u0007\u0178\u0001\u0000\u0000\u0000\u0007\u017a"+ - "\u0001\u0000\u0000\u0000\b\u017c\u0001\u0000\u0000\u0000\b\u017e\u0001"+ - "\u0000\u0000\u0000\b\u0180\u0001\u0000\u0000\u0000\b\u0182\u0001\u0000"+ - "\u0000\u0000\b\u0184\u0001\u0000\u0000\u0000\b\u0186\u0001\u0000\u0000"+ - "\u0000\b\u0188\u0001\u0000\u0000\u0000\b\u018a\u0001\u0000\u0000\u0000"+ - "\b\u018c\u0001\u0000\u0000\u0000\b\u018e\u0001\u0000\u0000\u0000\b\u0190"+ - "\u0001\u0000\u0000\u0000\b\u0192\u0001\u0000\u0000\u0000\b\u0194\u0001"+ - "\u0000\u0000\u0000\b\u0196\u0001\u0000\u0000\u0000\b\u0198\u0001\u0000"+ - "\u0000\u0000\b\u019a\u0001\u0000\u0000\u0000\b\u019c\u0001\u0000\u0000"+ - "\u0000\b\u019e\u0001\u0000\u0000\u0000\t\u01a0\u0001\u0000\u0000\u0000"+ - "\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4\u0001\u0000\u0000\u0000\t\u01a6"+ - "\u0001\u0000\u0000\u0000\n\u01a8\u0001\u0000\u0000\u0000\n\u01aa\u0001"+ - "\u0000\u0000\u0000\n\u01ac\u0001\u0000\u0000\u0000\n\u01ae\u0001\u0000"+ - "\u0000\u0000\n\u01b0\u0001\u0000\u0000\u0000\n\u01b2\u0001\u0000\u0000"+ - "\u0000\n\u01b4\u0001\u0000\u0000\u0000\n\u01b6\u0001\u0000\u0000\u0000"+ - "\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba\u0001\u0000\u0000\u0000\n\u01bc"+ - "\u0001\u0000\u0000\u0000\u000b\u01be\u0001\u0000\u0000\u0000\u000b\u01c0"+ - "\u0001\u0000\u0000\u0000\u000b\u01c2\u0001\u0000\u0000\u0000\u000b\u01c4"+ - "\u0001\u0000\u0000\u0000\u000b\u01c6\u0001\u0000\u0000\u0000\u000b\u01c8"+ - "\u0001\u0000\u0000\u0000\u000b\u01ca\u0001\u0000\u0000\u0000\u000b\u01cc"+ - "\u0001\u0000\u0000\u0000\u000b\u01ce\u0001\u0000\u0000\u0000\u000b\u01d0"+ - "\u0001\u0000\u0000\u0000\u000b\u01d2\u0001\u0000\u0000\u0000\f\u01d4\u0001"+ - "\u0000\u0000\u0000\f\u01d6\u0001\u0000\u0000\u0000\f\u01d8\u0001\u0000"+ - "\u0000\u0000\f\u01da\u0001\u0000\u0000\u0000\f\u01dc\u0001\u0000\u0000"+ - "\u0000\f\u01de\u0001\u0000\u0000\u0000\f\u01e0\u0001\u0000\u0000\u0000"+ - "\f\u01e2\u0001\u0000\u0000\u0000\r\u01e4\u0001\u0000\u0000\u0000\r\u01e6"+ - "\u0001\u0000\u0000\u0000\r\u01e8\u0001\u0000\u0000\u0000\r\u01ea\u0001"+ - "\u0000\u0000\u0000\r\u01ec\u0001\u0000\u0000\u0000\r\u01ee\u0001\u0000"+ - "\u0000\u0000\r\u01f0\u0001\u0000\u0000\u0000\r\u01f2\u0001\u0000\u0000"+ - "\u0000\r\u01f4\u0001\u0000\u0000\u0000\r\u01f6\u0001\u0000\u0000\u0000"+ - "\r\u01f8\u0001\u0000\u0000\u0000\r\u01fa\u0001\u0000\u0000\u0000\r\u01fc"+ - "\u0001\u0000\u0000\u0000\r\u01fe\u0001\u0000\u0000\u0000\r\u0200\u0001"+ - "\u0000\u0000\u0000\r\u0202\u0001\u0000\u0000\u0000\r\u0204\u0001\u0000"+ - "\u0000\u0000\r\u0206\u0001\u0000\u0000\u0000\r\u0208\u0001\u0000\u0000"+ - "\u0000\u000e\u020a\u0001\u0000\u0000\u0000\u000e\u020c\u0001\u0000\u0000"+ - "\u0000\u000e\u020e\u0001\u0000\u0000\u0000\u000e\u0210\u0001\u0000\u0000"+ - "\u0000\u000e\u0212\u0001\u0000\u0000\u0000\u000e\u0214\u0001\u0000\u0000"+ - "\u0000\u000e\u0216\u0001\u0000\u0000\u0000\u000e\u0218\u0001\u0000\u0000"+ - "\u0000\u000e\u021a\u0001\u0000\u0000\u0000\u000e\u021c\u0001\u0000\u0000"+ - "\u0000\u000e\u021e\u0001\u0000\u0000\u0000\u000e\u0220\u0001\u0000\u0000"+ - "\u0000\u000e\u0222\u0001\u0000\u0000\u0000\u000e\u0224\u0001\u0000\u0000"+ - "\u0000\u000f\u0226\u0001\u0000\u0000\u0000\u000f\u0228\u0001\u0000\u0000"+ - "\u0000\u000f\u022a\u0001\u0000\u0000\u0000\u000f\u022c\u0001\u0000\u0000"+ - "\u0000\u000f\u022e\u0001\u0000\u0000\u0000\u000f\u0230\u0001\u0000\u0000"+ - "\u0000\u000f\u0232\u0001\u0000\u0000\u0000\u000f\u0234\u0001\u0000\u0000"+ - "\u0000\u000f\u0236\u0001\u0000\u0000\u0000\u000f\u0238\u0001\u0000\u0000"+ - "\u0000\u000f\u023e\u0001\u0000\u0000\u0000\u000f\u0240\u0001\u0000\u0000"+ - "\u0000\u000f\u0242\u0001\u0000\u0000\u0000\u000f\u0244\u0001\u0000\u0000"+ - "\u0000\u0010\u0246\u0001\u0000\u0000\u0000\u0010\u0248\u0001\u0000\u0000"+ - "\u0000\u0010\u024a\u0001\u0000\u0000\u0000\u0010\u024c\u0001\u0000\u0000"+ - "\u0000\u0010\u024e\u0001\u0000\u0000\u0000\u0010\u0250\u0001\u0000\u0000"+ - "\u0000\u0010\u0252\u0001\u0000\u0000\u0000\u0010\u0254\u0001\u0000\u0000"+ - "\u0000\u0010\u0256\u0001\u0000\u0000\u0000\u0010\u0258\u0001\u0000\u0000"+ - "\u0000\u0010\u025a\u0001\u0000\u0000\u0000\u0010\u025c\u0001\u0000\u0000"+ - "\u0000\u0010\u025e\u0001\u0000\u0000\u0000\u0010\u0260\u0001\u0000\u0000"+ - "\u0000\u0010\u0262\u0001\u0000\u0000\u0000\u0010\u0264\u0001\u0000\u0000"+ - "\u0000\u0010\u0266\u0001\u0000\u0000\u0000\u0010\u0268\u0001\u0000\u0000"+ - "\u0000\u0010\u026a\u0001\u0000\u0000\u0000\u0011\u026c\u0001\u0000\u0000"+ - "\u0000\u0011\u026e\u0001\u0000\u0000\u0000\u0011\u0270\u0001\u0000\u0000"+ - "\u0000\u0011\u0272\u0001\u0000\u0000\u0000\u0011\u0274\u0001\u0000\u0000"+ - "\u0000\u0011\u0276\u0001\u0000\u0000\u0000\u0011\u0278\u0001\u0000\u0000"+ - "\u0000\u0011\u027a\u0001\u0000\u0000\u0000\u0011\u027c\u0001\u0000\u0000"+ - "\u0000\u0011\u027e\u0001\u0000\u0000\u0000\u0011\u0280\u0001\u0000\u0000"+ - "\u0000\u0011\u0282\u0001\u0000\u0000\u0000\u0011\u0284\u0001\u0000\u0000"+ - "\u0000\u0011\u0286\u0001\u0000\u0000\u0000\u0011\u0288\u0001\u0000\u0000"+ - "\u0000\u0011\u028a\u0001\u0000\u0000\u0000\u0012\u028c\u0001\u0000\u0000"+ - "\u0000\u0012\u028e\u0001\u0000\u0000\u0000\u0012\u0290\u0001\u0000\u0000"+ - "\u0000\u0012\u0292\u0001\u0000\u0000\u0000\u0012\u0294\u0001\u0000\u0000"+ - "\u0000\u0012\u0296\u0001\u0000\u0000\u0000\u0012\u0298\u0001\u0000\u0000"+ - "\u0000\u0012\u029a\u0001\u0000\u0000\u0000\u0012\u029c\u0001\u0000\u0000"+ - "\u0000\u0012\u029e\u0001\u0000\u0000\u0000\u0012\u02a0\u0001\u0000\u0000"+ - "\u0000\u0012\u02a2\u0001\u0000\u0000\u0000\u0012\u02a4\u0001\u0000\u0000"+ - "\u0000\u0012\u02a6\u0001\u0000\u0000\u0000\u0012\u02a8\u0001\u0000\u0000"+ - "\u0000\u0012\u02aa\u0001\u0000\u0000\u0000\u0012\u02ac\u0001\u0000\u0000"+ - "\u0000\u0012\u02ae\u0001\u0000\u0000\u0000\u0012\u02b0\u0001\u0000\u0000"+ - "\u0000\u0012\u02b2\u0001\u0000\u0000\u0000\u0012\u02b4\u0001\u0000\u0000"+ - "\u0000\u0012\u02b6\u0001\u0000\u0000\u0000\u0012\u02b8\u0001\u0000\u0000"+ - "\u0000\u0012\u02ba\u0001\u0000\u0000\u0000\u0012\u02bc\u0001\u0000\u0000"+ - "\u0000\u0013\u02be\u0001\u0000\u0000\u0000\u0013\u02c0\u0001\u0000\u0000"+ - "\u0000\u0013\u02c2\u0001\u0000\u0000\u0000\u0013\u02c4\u0001\u0000\u0000"+ - "\u0000\u0013\u02c6\u0001\u0000\u0000\u0000\u0014\u02c8\u0001\u0000\u0000"+ - "\u0000\u0016\u02d9\u0001\u0000\u0000\u0000\u0018\u02e9\u0001\u0000\u0000"+ - "\u0000\u001a\u02ef\u0001\u0000\u0000\u0000\u001c\u02fe\u0001\u0000\u0000"+ - "\u0000\u001e\u0307\u0001\u0000\u0000\u0000 \u0312\u0001\u0000\u0000\u0000"+ - "\"\u031f\u0001\u0000\u0000\u0000$\u0329\u0001\u0000\u0000\u0000&\u0330"+ - "\u0001\u0000\u0000\u0000(\u0337\u0001\u0000\u0000\u0000*\u033f\u0001\u0000"+ - "\u0000\u0000,\u0348\u0001\u0000\u0000\u0000.\u034e\u0001\u0000\u0000\u0000"+ - "0\u0357\u0001\u0000\u0000\u00002\u035e\u0001\u0000\u0000\u00004\u0366"+ - "\u0001\u0000\u0000\u00006\u036e\u0001\u0000\u0000\u00008\u037a\u0001\u0000"+ - "\u0000\u0000:\u0389\u0001\u0000\u0000\u0000<\u039d\u0001\u0000\u0000\u0000"+ - ">\u03a7\u0001\u0000\u0000\u0000@\u03ae\u0001\u0000\u0000\u0000B\u03b3"+ - "\u0001\u0000\u0000\u0000D\u03bf\u0001\u0000\u0000\u0000F\u03c6\u0001\u0000"+ - "\u0000\u0000H\u03cd\u0001\u0000\u0000\u0000J\u03d6\u0001\u0000\u0000\u0000"+ - "L\u03e4\u0001\u0000\u0000\u0000N\u03ed\u0001\u0000\u0000\u0000P\u03f5"+ - "\u0001\u0000\u0000\u0000R\u03fd\u0001\u0000\u0000\u0000T\u0406\u0001\u0000"+ - "\u0000\u0000V\u0412\u0001\u0000\u0000\u0000X\u0418\u0001\u0000\u0000\u0000"+ - "Z\u0424\u0001\u0000\u0000\u0000\\\u042b\u0001\u0000\u0000\u0000^\u0432"+ - "\u0001\u0000\u0000\u0000`\u043e\u0001\u0000\u0000\u0000b\u0447\u0001\u0000"+ - "\u0000\u0000d\u0450\u0001\u0000\u0000\u0000f\u0456\u0001\u0000\u0000\u0000"+ - "h\u045e\u0001\u0000\u0000\u0000j\u0464\u0001\u0000\u0000\u0000l\u0469"+ - "\u0001\u0000\u0000\u0000n\u046f\u0001\u0000\u0000\u0000p\u0473\u0001\u0000"+ - "\u0000\u0000r\u0477\u0001\u0000\u0000\u0000t\u047b\u0001\u0000\u0000\u0000"+ - "v\u047f\u0001\u0000\u0000\u0000x\u0483\u0001\u0000\u0000\u0000z\u0487"+ - "\u0001\u0000\u0000\u0000|\u048b\u0001\u0000\u0000\u0000~\u048f\u0001\u0000"+ - "\u0000\u0000\u0080\u0493\u0001\u0000\u0000\u0000\u0082\u0497\u0001\u0000"+ - "\u0000\u0000\u0084\u049b\u0001\u0000\u0000\u0000\u0086\u04a0\u0001\u0000"+ - "\u0000\u0000\u0088\u04a6\u0001\u0000\u0000\u0000\u008a\u04ab\u0001\u0000"+ - "\u0000\u0000\u008c\u04b0\u0001\u0000\u0000\u0000\u008e\u04b9\u0001\u0000"+ - "\u0000\u0000\u0090\u04c0\u0001\u0000\u0000\u0000\u0092\u04c4\u0001\u0000"+ - "\u0000\u0000\u0094\u04c8\u0001\u0000\u0000\u0000\u0096\u04cc\u0001\u0000"+ - "\u0000\u0000\u0098\u04d0\u0001\u0000\u0000\u0000\u009a\u04d4\u0001\u0000"+ - "\u0000\u0000\u009c\u04da\u0001\u0000\u0000\u0000\u009e\u04e1\u0001\u0000"+ - "\u0000\u0000\u00a0\u04e5\u0001\u0000\u0000\u0000\u00a2\u04e9\u0001\u0000"+ - "\u0000\u0000\u00a4\u04ed\u0001\u0000\u0000\u0000\u00a6\u04f1\u0001\u0000"+ - "\u0000\u0000\u00a8\u04f5\u0001\u0000\u0000\u0000\u00aa\u04f9\u0001\u0000"+ - "\u0000\u0000\u00ac\u04fd\u0001\u0000\u0000\u0000\u00ae\u0501\u0001\u0000"+ - "\u0000\u0000\u00b0\u0505\u0001\u0000\u0000\u0000\u00b2\u0509\u0001\u0000"+ - "\u0000\u0000\u00b4\u050d\u0001\u0000\u0000\u0000\u00b6\u0511\u0001\u0000"+ - "\u0000\u0000\u00b8\u0515\u0001\u0000\u0000\u0000\u00ba\u0519\u0001\u0000"+ - "\u0000\u0000\u00bc\u051d\u0001\u0000\u0000\u0000\u00be\u0522\u0001\u0000"+ - "\u0000\u0000\u00c0\u0527\u0001\u0000\u0000\u0000\u00c2\u052b\u0001\u0000"+ - "\u0000\u0000\u00c4\u052f\u0001\u0000\u0000\u0000\u00c6\u0533\u0001\u0000"+ - "\u0000\u0000\u00c8\u0537\u0001\u0000\u0000\u0000\u00ca\u0539\u0001\u0000"+ - "\u0000\u0000\u00cc\u053b\u0001\u0000\u0000\u0000\u00ce\u053e\u0001\u0000"+ - "\u0000\u0000\u00d0\u0540\u0001\u0000\u0000\u0000\u00d2\u0549\u0001\u0000"+ - "\u0000\u0000\u00d4\u054b\u0001\u0000\u0000\u0000\u00d6\u0550\u0001\u0000"+ - "\u0000\u0000\u00d8\u0552\u0001\u0000\u0000\u0000\u00da\u0557\u0001\u0000"+ - "\u0000\u0000\u00dc\u0576\u0001\u0000\u0000\u0000\u00de\u0579\u0001\u0000"+ - "\u0000\u0000\u00e0\u05a7\u0001\u0000\u0000\u0000\u00e2\u05a9\u0001\u0000"+ - "\u0000\u0000\u00e4\u05ad\u0001\u0000\u0000\u0000\u00e6\u05b1\u0001\u0000"+ - "\u0000\u0000\u00e8\u05b3\u0001\u0000\u0000\u0000\u00ea\u05b6\u0001\u0000"+ - "\u0000\u0000\u00ec\u05b9\u0001\u0000\u0000\u0000\u00ee\u05bb\u0001\u0000"+ - "\u0000\u0000\u00f0\u05bd\u0001\u0000\u0000\u0000\u00f2\u05bf\u0001\u0000"+ - "\u0000\u0000\u00f4\u05c4\u0001\u0000\u0000\u0000\u00f6\u05c6\u0001\u0000"+ - "\u0000\u0000\u00f8\u05cc\u0001\u0000\u0000\u0000\u00fa\u05d2\u0001\u0000"+ - "\u0000\u0000\u00fc\u05d5\u0001\u0000\u0000\u0000\u00fe\u05d8\u0001\u0000"+ - "\u0000\u0000\u0100\u05dd\u0001\u0000\u0000\u0000\u0102\u05e2\u0001\u0000"+ - "\u0000\u0000\u0104\u05e6\u0001\u0000\u0000\u0000\u0106\u05eb\u0001\u0000"+ - "\u0000\u0000\u0108\u05f1\u0001\u0000\u0000\u0000\u010a\u05f4\u0001\u0000"+ - "\u0000\u0000\u010c\u05f7\u0001\u0000\u0000\u0000\u010e\u05f9\u0001\u0000"+ - "\u0000\u0000\u0110\u05ff\u0001\u0000\u0000\u0000\u0112\u0604\u0001\u0000"+ - "\u0000\u0000\u0114\u0609\u0001\u0000\u0000\u0000\u0116\u060c\u0001\u0000"+ - "\u0000\u0000\u0118\u060f\u0001\u0000\u0000\u0000\u011a\u0612\u0001\u0000"+ - "\u0000\u0000\u011c\u0614\u0001\u0000\u0000\u0000\u011e\u0617\u0001\u0000"+ - "\u0000\u0000\u0120\u0619\u0001\u0000\u0000\u0000\u0122\u061c\u0001\u0000"+ - "\u0000\u0000\u0124\u061e\u0001\u0000\u0000\u0000\u0126\u0620\u0001\u0000"+ - "\u0000\u0000\u0128\u0622\u0001\u0000\u0000\u0000\u012a\u0624\u0001\u0000"+ - "\u0000\u0000\u012c\u0626\u0001\u0000\u0000\u0000\u012e\u0628\u0001\u0000"+ - "\u0000\u0000\u0130\u062a\u0001\u0000\u0000\u0000\u0132\u062d\u0001\u0000"+ - "\u0000\u0000\u0134\u0642\u0001\u0000\u0000\u0000\u0136\u0655\u0001\u0000"+ - "\u0000\u0000\u0138\u0657\u0001\u0000\u0000\u0000\u013a\u065c\u0001\u0000"+ - "\u0000\u0000\u013c\u0661\u0001\u0000\u0000\u0000\u013e\u0666\u0001\u0000"+ - "\u0000\u0000\u0140\u067b\u0001\u0000\u0000\u0000\u0142\u067d\u0001\u0000"+ - "\u0000\u0000\u0144\u0685\u0001\u0000\u0000\u0000\u0146\u0687\u0001\u0000"+ - "\u0000\u0000\u0148\u068b\u0001\u0000\u0000\u0000\u014a\u068f\u0001\u0000"+ - "\u0000\u0000\u014c\u0693\u0001\u0000\u0000\u0000\u014e\u0698\u0001\u0000"+ - "\u0000\u0000\u0150\u069c\u0001\u0000\u0000\u0000\u0152\u06a0\u0001\u0000"+ - "\u0000\u0000\u0154\u06a4\u0001\u0000\u0000\u0000\u0156\u06a8\u0001\u0000"+ - "\u0000\u0000\u0158\u06b1\u0001\u0000\u0000\u0000\u015a\u06b7\u0001\u0000"+ - "\u0000\u0000\u015c\u06bb\u0001\u0000\u0000\u0000\u015e\u06bf\u0001\u0000"+ - "\u0000\u0000\u0160\u06c5\u0001\u0000\u0000\u0000\u0162\u06cd\u0001\u0000"+ - "\u0000\u0000\u0164\u06d0\u0001\u0000\u0000\u0000\u0166\u06d4\u0001\u0000"+ - "\u0000\u0000\u0168\u06d8\u0001\u0000\u0000\u0000\u016a\u06dc\u0001\u0000"+ - "\u0000\u0000\u016c\u06e0\u0001\u0000\u0000\u0000\u016e\u06e4\u0001\u0000"+ - "\u0000\u0000\u0170\u06e8\u0001\u0000\u0000\u0000\u0172\u06ed\u0001\u0000"+ - "\u0000\u0000\u0174\u06f3\u0001\u0000\u0000\u0000\u0176\u06f8\u0001\u0000"+ - "\u0000\u0000\u0178\u06fc\u0001\u0000\u0000\u0000\u017a\u0700\u0001\u0000"+ - "\u0000\u0000\u017c\u0704\u0001\u0000\u0000\u0000\u017e\u0709\u0001\u0000"+ - "\u0000\u0000\u0180\u070f\u0001\u0000\u0000\u0000\u0182\u0715\u0001\u0000"+ - "\u0000\u0000\u0184\u071b\u0001\u0000\u0000\u0000\u0186\u071f\u0001\u0000"+ - "\u0000\u0000\u0188\u0725\u0001\u0000\u0000\u0000\u018a\u0729\u0001\u0000"+ - "\u0000\u0000\u018c\u072d\u0001\u0000\u0000\u0000\u018e\u0731\u0001\u0000"+ - "\u0000\u0000\u0190\u0735\u0001\u0000\u0000\u0000\u0192\u0739\u0001\u0000"+ - "\u0000\u0000\u0194\u073d\u0001\u0000\u0000\u0000\u0196\u0741\u0001\u0000"+ - "\u0000\u0000\u0198\u0745\u0001\u0000\u0000\u0000\u019a\u0749\u0001\u0000"+ - "\u0000\u0000\u019c\u074d\u0001\u0000\u0000\u0000\u019e\u0751\u0001\u0000"+ - "\u0000\u0000\u01a0\u0755\u0001\u0000\u0000\u0000\u01a2\u075e\u0001\u0000"+ - "\u0000\u0000\u01a4\u0762\u0001\u0000\u0000\u0000\u01a6\u0766\u0001\u0000"+ - "\u0000\u0000\u01a8\u076a\u0001\u0000\u0000\u0000\u01aa\u076f\u0001\u0000"+ - "\u0000\u0000\u01ac\u0774\u0001\u0000\u0000\u0000\u01ae\u0778\u0001\u0000"+ - "\u0000\u0000\u01b0\u077e\u0001\u0000\u0000\u0000\u01b2\u0787\u0001\u0000"+ - "\u0000\u0000\u01b4\u078b\u0001\u0000\u0000\u0000\u01b6\u078f\u0001\u0000"+ - "\u0000\u0000\u01b8\u0793\u0001\u0000\u0000\u0000\u01ba\u0797\u0001\u0000"+ - "\u0000\u0000\u01bc\u079b\u0001\u0000\u0000\u0000\u01be\u079f\u0001\u0000"+ - "\u0000\u0000\u01c0\u07a4\u0001\u0000\u0000\u0000\u01c2\u07aa\u0001\u0000"+ - "\u0000\u0000\u01c4\u07ae\u0001\u0000\u0000\u0000\u01c6\u07b2\u0001\u0000"+ - "\u0000\u0000\u01c8\u07b6\u0001\u0000\u0000\u0000\u01ca\u07bb\u0001\u0000"+ - "\u0000\u0000\u01cc\u07bf\u0001\u0000\u0000\u0000\u01ce\u07c3\u0001\u0000"+ - "\u0000\u0000\u01d0\u07c7\u0001\u0000\u0000\u0000\u01d2\u07cb\u0001\u0000"+ - "\u0000\u0000\u01d4\u07cf\u0001\u0000\u0000\u0000\u01d6\u07d5\u0001\u0000"+ - "\u0000\u0000\u01d8\u07dc\u0001\u0000\u0000\u0000\u01da\u07e0\u0001\u0000"+ - "\u0000\u0000\u01dc\u07e4\u0001\u0000\u0000\u0000\u01de\u07e8\u0001\u0000"+ - "\u0000\u0000\u01e0\u07ec\u0001\u0000\u0000\u0000\u01e2\u07f0\u0001\u0000"+ - "\u0000\u0000\u01e4\u07f4\u0001\u0000\u0000\u0000\u01e6\u07f9\u0001\u0000"+ - "\u0000\u0000\u01e8\u07fd\u0001\u0000\u0000\u0000\u01ea\u0801\u0001\u0000"+ - "\u0000\u0000\u01ec\u0805\u0001\u0000\u0000\u0000\u01ee\u0809\u0001\u0000"+ - "\u0000\u0000\u01f0\u080d\u0001\u0000\u0000\u0000\u01f2\u0811\u0001\u0000"+ - "\u0000\u0000\u01f4\u0815\u0001\u0000\u0000\u0000\u01f6\u0819\u0001\u0000"+ - "\u0000\u0000\u01f8\u081d\u0001\u0000\u0000\u0000\u01fa\u0821\u0001\u0000"+ - "\u0000\u0000\u01fc\u0825\u0001\u0000\u0000\u0000\u01fe\u0829\u0001\u0000"+ - "\u0000\u0000\u0200\u082d\u0001\u0000\u0000\u0000\u0202\u0831\u0001\u0000"+ - "\u0000\u0000\u0204\u0835\u0001\u0000\u0000\u0000\u0206\u0839\u0001\u0000"+ - "\u0000\u0000\u0208\u083d\u0001\u0000\u0000\u0000\u020a\u0841\u0001\u0000"+ - "\u0000\u0000\u020c\u0846\u0001\u0000\u0000\u0000\u020e\u084c\u0001\u0000"+ - "\u0000\u0000\u0210\u0850\u0001\u0000\u0000\u0000\u0212\u0854\u0001\u0000"+ - "\u0000\u0000\u0214\u0858\u0001\u0000\u0000\u0000\u0216\u085c\u0001\u0000"+ - "\u0000\u0000\u0218\u0860\u0001\u0000\u0000\u0000\u021a\u0864\u0001\u0000"+ - "\u0000\u0000\u021c\u0868\u0001\u0000\u0000\u0000\u021e\u086c\u0001\u0000"+ - "\u0000\u0000\u0220\u0870\u0001\u0000\u0000\u0000\u0222\u0874\u0001\u0000"+ - "\u0000\u0000\u0224\u0878\u0001\u0000\u0000\u0000\u0226\u087c\u0001\u0000"+ - "\u0000\u0000\u0228\u0881\u0001\u0000\u0000\u0000\u022a\u0887\u0001\u0000"+ - "\u0000\u0000\u022c\u088b\u0001\u0000\u0000\u0000\u022e\u088f\u0001\u0000"+ - "\u0000\u0000\u0230\u0893\u0001\u0000\u0000\u0000\u0232\u0897\u0001\u0000"+ - "\u0000\u0000\u0234\u089b\u0001\u0000\u0000\u0000\u0236\u089f\u0001\u0000"+ - "\u0000\u0000\u0238\u08a3\u0001\u0000\u0000\u0000\u023a\u08ab\u0001\u0000"+ - "\u0000\u0000\u023c\u08c0\u0001\u0000\u0000\u0000\u023e\u08c4\u0001\u0000"+ - "\u0000\u0000\u0240\u08c8\u0001\u0000\u0000\u0000\u0242\u08cc\u0001\u0000"+ - "\u0000\u0000\u0244\u08d0\u0001\u0000\u0000\u0000\u0246\u08d4\u0001\u0000"+ - "\u0000\u0000\u0248\u08d8\u0001\u0000\u0000\u0000\u024a\u08dc\u0001\u0000"+ - "\u0000\u0000\u024c\u08e0\u0001\u0000\u0000\u0000\u024e\u08e4\u0001\u0000"+ - "\u0000\u0000\u0250\u08e8\u0001\u0000\u0000\u0000\u0252\u08ec\u0001\u0000"+ - "\u0000\u0000\u0254\u08f0\u0001\u0000\u0000\u0000\u0256\u08f4\u0001\u0000"+ - "\u0000\u0000\u0258\u08f8\u0001\u0000\u0000\u0000\u025a\u08fd\u0001\u0000"+ - "\u0000\u0000\u025c\u0902\u0001\u0000\u0000\u0000\u025e\u0908\u0001\u0000"+ - "\u0000\u0000\u0260\u090f\u0001\u0000\u0000\u0000\u0262\u0913\u0001\u0000"+ - "\u0000\u0000\u0264\u0917\u0001\u0000\u0000\u0000\u0266\u091b\u0001\u0000"+ - "\u0000\u0000\u0268\u0928\u0001\u0000\u0000\u0000\u026a\u0933\u0001\u0000"+ - "\u0000\u0000\u026c\u0935\u0001\u0000\u0000\u0000\u026e\u093a\u0001\u0000"+ - "\u0000\u0000\u0270\u0940\u0001\u0000\u0000\u0000\u0272\u0944\u0001\u0000"+ - "\u0000\u0000\u0274\u0948\u0001\u0000\u0000\u0000\u0276\u094c\u0001\u0000"+ - "\u0000\u0000\u0278\u0950\u0001\u0000\u0000\u0000\u027a\u0954\u0001\u0000"+ - "\u0000\u0000\u027c\u0958\u0001\u0000\u0000\u0000\u027e\u095c\u0001\u0000"+ - "\u0000\u0000\u0280\u0960\u0001\u0000\u0000\u0000\u0282\u0964\u0001\u0000"+ - "\u0000\u0000\u0284\u0967\u0001\u0000\u0000\u0000\u0286\u096b\u0001\u0000"+ - "\u0000\u0000\u0288\u096f\u0001\u0000\u0000\u0000\u028a\u0973\u0001\u0000"+ - "\u0000\u0000\u028c\u0977\u0001\u0000\u0000\u0000\u028e\u097b\u0001\u0000"+ - "\u0000\u0000\u0290\u097f\u0001\u0000\u0000\u0000\u0292\u0983\u0001\u0000"+ - "\u0000\u0000\u0294\u0988\u0001\u0000\u0000\u0000\u0296\u098c\u0001\u0000"+ - "\u0000\u0000\u0298\u0990\u0001\u0000\u0000\u0000\u029a\u0994\u0001\u0000"+ - "\u0000\u0000\u029c\u0998\u0001\u0000\u0000\u0000\u029e\u099c\u0001\u0000"+ - "\u0000\u0000\u02a0\u09a0\u0001\u0000\u0000\u0000\u02a2\u09a4\u0001\u0000"+ - "\u0000\u0000\u02a4\u09a8\u0001\u0000\u0000\u0000\u02a6\u09ac\u0001\u0000"+ - "\u0000\u0000\u02a8\u09b0\u0001\u0000\u0000\u0000\u02aa\u09b4\u0001\u0000"+ - "\u0000\u0000\u02ac\u09b8\u0001\u0000\u0000\u0000\u02ae\u09bc\u0001\u0000"+ - "\u0000\u0000\u02b0\u09c0\u0001\u0000\u0000\u0000\u02b2\u09c4\u0001\u0000"+ - "\u0000\u0000\u02b4\u09c8\u0001\u0000\u0000\u0000\u02b6\u09cc\u0001\u0000"+ - "\u0000\u0000\u02b8\u09d0\u0001\u0000\u0000\u0000\u02ba\u09d4\u0001\u0000"+ - "\u0000\u0000\u02bc\u09d8\u0001\u0000\u0000\u0000\u02be\u09dc\u0001\u0000"+ - "\u0000\u0000\u02c0\u09e1\u0001\u0000\u0000\u0000\u02c2\u09e6\u0001\u0000"+ - "\u0000\u0000\u02c4\u09ea\u0001\u0000\u0000\u0000\u02c6\u09ee\u0001\u0000"+ - "\u0000\u0000\u02c8\u02c9\u0005/\u0000\u0000\u02c9\u02ca\u0005/\u0000\u0000"+ - "\u02ca\u02ce\u0001\u0000\u0000\u0000\u02cb\u02cd\b\u0000\u0000\u0000\u02cc"+ - "\u02cb\u0001\u0000\u0000\u0000\u02cd\u02d0\u0001\u0000\u0000\u0000\u02ce"+ - "\u02cc\u0001\u0000\u0000\u0000\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf"+ - "\u02d2\u0001\u0000\u0000\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000\u02d1"+ - "\u02d3\u0005\r\u0000\u0000\u02d2\u02d1\u0001\u0000\u0000\u0000\u02d2\u02d3"+ - "\u0001\u0000\u0000\u0000\u02d3\u02d5\u0001\u0000\u0000\u0000\u02d4\u02d6"+ - "\u0005\n\u0000\u0000\u02d5\u02d4\u0001\u0000\u0000\u0000\u02d5\u02d6\u0001"+ - "\u0000\u0000\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d7\u02d8\u0006"+ - "\u0000\u0000\u0000\u02d8\u0015\u0001\u0000\u0000\u0000\u02d9\u02da\u0005"+ - "/\u0000\u0000\u02da\u02db\u0005*\u0000\u0000\u02db\u02e0\u0001\u0000\u0000"+ - "\u0000\u02dc\u02df\u0003\u0016\u0001\u0000\u02dd\u02df\t\u0000\u0000\u0000"+ - "\u02de\u02dc\u0001\u0000\u0000\u0000\u02de\u02dd\u0001\u0000\u0000\u0000"+ - "\u02df\u02e2\u0001\u0000\u0000\u0000\u02e0\u02e1\u0001\u0000\u0000\u0000"+ - "\u02e0\u02de\u0001\u0000\u0000\u0000\u02e1\u02e3\u0001\u0000\u0000\u0000"+ - "\u02e2\u02e0\u0001\u0000\u0000\u0000\u02e3\u02e4\u0005*\u0000\u0000\u02e4"+ - "\u02e5\u0005/\u0000\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u02e7"+ - "\u0006\u0001\u0000\u0000\u02e7\u0017\u0001\u0000\u0000\u0000\u02e8\u02ea"+ - "\u0007\u0001\u0000\u0000\u02e9\u02e8\u0001\u0000\u0000\u0000\u02ea\u02eb"+ - "\u0001\u0000\u0000\u0000\u02eb\u02e9\u0001\u0000\u0000\u0000\u02eb\u02ec"+ - "\u0001\u0000\u0000\u0000\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u02ee"+ - "\u0006\u0002\u0000\u0000\u02ee\u0019\u0001\u0000\u0000\u0000\u02ef\u02f0"+ - "\u0007\u0002\u0000\u0000\u02f0\u02f1\u0007\u0003\u0000\u0000\u02f1\u02f2"+ - "\u0007\u0004\u0000\u0000\u02f2\u02f3\u0007\u0005\u0000\u0000\u02f3\u02f4"+ - "\u0007\u0006\u0000\u0000\u02f4\u02f5\u0007\u0007\u0000\u0000\u02f5\u02f6"+ - "\u0005_\u0000\u0000\u02f6\u02f7\u0007\b\u0000\u0000\u02f7\u02f8\u0007"+ - "\t\u0000\u0000\u02f8\u02f9\u0007\n\u0000\u0000\u02f9\u02fa\u0007\u0005"+ - "\u0000\u0000\u02fa\u02fb\u0007\u000b\u0000\u0000\u02fb\u02fc\u0001\u0000"+ - "\u0000\u0000\u02fc\u02fd\u0006\u0003\u0001\u0000\u02fd\u001b\u0001\u0000"+ - "\u0000\u0000\u02fe\u02ff\u0007\u0007\u0000\u0000\u02ff\u0300\u0007\u0005"+ - "\u0000\u0000\u0300\u0301\u0007\f\u0000\u0000\u0301\u0302\u0007\n\u0000"+ - "\u0000\u0302\u0303\u0007\u0002\u0000\u0000\u0303\u0304\u0007\u0003\u0000"+ - "\u0000\u0304\u0305\u0001\u0000\u0000\u0000\u0305\u0306\u0006\u0004\u0002"+ - "\u0000\u0306\u001d\u0001\u0000\u0000\u0000\u0307\u0308\u0004\u0005\u0000"+ - "\u0000\u0308\u0309\u0007\u0007\u0000\u0000\u0309\u030a\u0007\r\u0000\u0000"+ - "\u030a\u030b\u0007\b\u0000\u0000\u030b\u030c\u0007\u000e\u0000\u0000\u030c"+ - "\u030d\u0007\u0004\u0000\u0000\u030d\u030e\u0007\n\u0000\u0000\u030e\u030f"+ - "\u0007\u0005\u0000\u0000\u030f\u0310\u0001\u0000\u0000\u0000\u0310\u0311"+ - "\u0006\u0005\u0003\u0000\u0311\u001f\u0001\u0000\u0000\u0000\u0312\u0313"+ - "\u0007\u0002\u0000\u0000\u0313\u0314\u0007\t\u0000\u0000\u0314\u0315\u0007"+ - "\u000f\u0000\u0000\u0315\u0316\u0007\b\u0000\u0000\u0316\u0317\u0007\u000e"+ - "\u0000\u0000\u0317\u0318\u0007\u0007\u0000\u0000\u0318\u0319\u0007\u000b"+ - "\u0000\u0000\u0319\u031a\u0007\n\u0000\u0000\u031a\u031b\u0007\t\u0000"+ - "\u0000\u031b\u031c\u0007\u0005\u0000\u0000\u031c\u031d\u0001\u0000\u0000"+ - "\u0000\u031d\u031e\u0006\u0006\u0004\u0000\u031e!\u0001\u0000\u0000\u0000"+ - "\u031f\u0320\u0007\u0010\u0000\u0000\u0320\u0321\u0007\n\u0000\u0000\u0321"+ - "\u0322\u0007\u0011\u0000\u0000\u0322\u0323\u0007\u0011\u0000\u0000\u0323"+ - "\u0324\u0007\u0007\u0000\u0000\u0324\u0325\u0007\u0002\u0000\u0000\u0325"+ - "\u0326\u0007\u000b\u0000\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327"+ - "\u0328\u0006\u0007\u0004\u0000\u0328#\u0001\u0000\u0000\u0000\u0329\u032a"+ - "\u0007\u0007\u0000\u0000\u032a\u032b\u0007\u0012\u0000\u0000\u032b\u032c"+ - "\u0007\u0004\u0000\u0000\u032c\u032d\u0007\u000e\u0000\u0000\u032d\u032e"+ - "\u0001\u0000\u0000\u0000\u032e\u032f\u0006\b\u0004\u0000\u032f%\u0001"+ - "\u0000\u0000\u0000\u0330\u0331\u0007\u0006\u0000\u0000\u0331\u0332\u0007"+ - "\f\u0000\u0000\u0332\u0333\u0007\t\u0000\u0000\u0333\u0334\u0007\u0013"+ - "\u0000\u0000\u0334\u0335\u0001\u0000\u0000\u0000\u0335\u0336\u0006\t\u0004"+ - "\u0000\u0336\'\u0001\u0000\u0000\u0000\u0337\u0338\u0007\u000e\u0000\u0000"+ - "\u0338\u0339\u0007\n\u0000\u0000\u0339\u033a\u0007\u000f\u0000\u0000\u033a"+ - "\u033b\u0007\n\u0000\u0000\u033b\u033c\u0007\u000b\u0000\u0000\u033c\u033d"+ - "\u0001\u0000\u0000\u0000\u033d\u033e\u0006\n\u0004\u0000\u033e)\u0001"+ - "\u0000\u0000\u0000\u033f\u0340\u0007\f\u0000\u0000\u0340\u0341\u0007\u0007"+ - "\u0000\u0000\u0341\u0342\u0007\f\u0000\u0000\u0342\u0343\u0007\u0004\u0000"+ - "\u0000\u0343\u0344\u0007\u0005\u0000\u0000\u0344\u0345\u0007\u0013\u0000"+ - "\u0000\u0345\u0346\u0001\u0000\u0000\u0000\u0346\u0347\u0006\u000b\u0004"+ - "\u0000\u0347+\u0001\u0000\u0000\u0000\u0348\u0349\u0007\f\u0000\u0000"+ - "\u0349\u034a\u0007\t\u0000\u0000\u034a\u034b\u0007\u0014\u0000\u0000\u034b"+ - "\u034c\u0001\u0000\u0000\u0000\u034c\u034d\u0006\f\u0004\u0000\u034d-"+ - "\u0001\u0000\u0000\u0000\u034e\u034f\u0007\u0011\u0000\u0000\u034f\u0350"+ - "\u0007\u0004\u0000\u0000\u0350\u0351\u0007\u000f\u0000\u0000\u0351\u0352"+ - "\u0007\b\u0000\u0000\u0352\u0353\u0007\u000e\u0000\u0000\u0353\u0354\u0007"+ - "\u0007\u0000\u0000\u0354\u0355\u0001\u0000\u0000\u0000\u0355\u0356\u0006"+ - "\r\u0004\u0000\u0356/\u0001\u0000\u0000\u0000\u0357\u0358\u0007\u0011"+ - "\u0000\u0000\u0358\u0359\u0007\t\u0000\u0000\u0359\u035a\u0007\f\u0000"+ - "\u0000\u035a\u035b\u0007\u000b\u0000\u0000\u035b\u035c\u0001\u0000\u0000"+ - "\u0000\u035c\u035d\u0006\u000e\u0004\u0000\u035d1\u0001\u0000\u0000\u0000"+ - "\u035e\u035f\u0007\u0011\u0000\u0000\u035f\u0360\u0007\u000b\u0000\u0000"+ - "\u0360\u0361\u0007\u0004\u0000\u0000\u0361\u0362\u0007\u000b\u0000\u0000"+ - "\u0362\u0363\u0007\u0011\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000"+ - "\u0364\u0365\u0006\u000f\u0004\u0000\u03653\u0001\u0000\u0000\u0000\u0366"+ - "\u0367\u0007\u0014\u0000\u0000\u0367\u0368\u0007\u0003\u0000\u0000\u0368"+ - "\u0369\u0007\u0007\u0000\u0000\u0369\u036a\u0007\f\u0000\u0000\u036a\u036b"+ - "\u0007\u0007\u0000\u0000\u036b\u036c\u0001\u0000\u0000\u0000\u036c\u036d"+ - "\u0006\u0010\u0004\u0000\u036d5\u0001\u0000\u0000\u0000\u036e\u036f\u0007"+ - "\u0015\u0000\u0000\u036f\u0370\u0007\f\u0000\u0000\u0370\u0371\u0007\n"+ - "\u0000\u0000\u0371\u0372\u0005_\u0000\u0000\u0372\u0373\u0007\b\u0000"+ - "\u0000\u0373\u0374\u0007\u0004\u0000\u0000\u0374\u0375\u0007\f\u0000\u0000"+ - "\u0375\u0376\u0007\u000b\u0000\u0000\u0376\u0377\u0007\u0011\u0000\u0000"+ - "\u0377\u0378\u0001\u0000\u0000\u0000\u0378\u0379\u0006\u0011\u0004\u0000"+ - "\u03797\u0001\u0000\u0000\u0000\u037a\u037b\u0007\u000f\u0000\u0000\u037b"+ - "\u037c\u0007\u0007\u0000\u0000\u037c\u037d\u0007\u000b\u0000\u0000\u037d"+ - "\u037e\u0007\f\u0000\u0000\u037e\u037f\u0007\n\u0000\u0000\u037f\u0380"+ - "\u0007\u0002\u0000\u0000\u0380\u0381\u0007\u0011\u0000\u0000\u0381\u0382"+ - "\u0005_\u0000\u0000\u0382\u0383\u0007\n\u0000\u0000\u0383\u0384\u0007"+ - "\u0005\u0000\u0000\u0384\u0385\u0007\u0016\u0000\u0000\u0385\u0386\u0007"+ - "\t\u0000\u0000\u0386\u0387\u0001\u0000\u0000\u0000\u0387\u0388\u0006\u0012"+ - "\u0004\u0000\u03889\u0001\u0000\u0000\u0000\u0389\u038a\u0007\f\u0000"+ - "\u0000\u038a\u038b\u0007\u0007\u0000\u0000\u038b\u038c\u0007\u0006\u0000"+ - "\u0000\u038c\u038d\u0007\n\u0000\u0000\u038d\u038e\u0007\u0011\u0000\u0000"+ - "\u038e\u038f\u0007\u000b\u0000\u0000\u038f\u0390\u0007\u0007\u0000\u0000"+ - "\u0390\u0391\u0007\f\u0000\u0000\u0391\u0392\u0007\u0007\u0000\u0000\u0392"+ - "\u0393\u0007\u0010\u0000\u0000\u0393\u0394\u0005_\u0000\u0000\u0394\u0395"+ - "\u0007\u0010\u0000\u0000\u0395\u0396\u0007\t\u0000\u0000\u0396\u0397\u0007"+ - "\u000f\u0000\u0000\u0397\u0398\u0007\u0004\u0000\u0000\u0398\u0399\u0007"+ - "\n\u0000\u0000\u0399\u039a\u0007\u0005\u0000\u0000\u039a\u039b\u0001\u0000"+ - "\u0000\u0000\u039b\u039c\u0006\u0013\u0004\u0000\u039c;\u0001\u0000\u0000"+ - "\u0000\u039d\u039e\u0007\u000b\u0000\u0000\u039e\u039f\u0007\u0011\u0000"+ - "\u0000\u039f\u03a0\u0005_\u0000\u0000\u03a0\u03a1\u0007\n\u0000\u0000"+ - "\u03a1\u03a2\u0007\u0005\u0000\u0000\u03a2\u03a3\u0007\u0016\u0000\u0000"+ - "\u03a3\u03a4\u0007\t\u0000\u0000\u03a4\u03a5\u0001\u0000\u0000\u0000\u03a5"+ - "\u03a6\u0006\u0014\u0004\u0000\u03a6=\u0001\u0000\u0000\u0000\u03a7\u03a8"+ - "\u0007\u0016\u0000\u0000\u03a8\u03a9\u0007\f\u0000\u0000\u03a9\u03aa\u0007"+ - "\t\u0000\u0000\u03aa\u03ab\u0007\u000f\u0000\u0000\u03ab\u03ac\u0001\u0000"+ - "\u0000\u0000\u03ac\u03ad\u0006\u0015\u0005\u0000\u03ad?\u0001\u0000\u0000"+ - "\u0000\u03ae\u03af\u0007\u000b\u0000\u0000\u03af\u03b0\u0007\u0011\u0000"+ - "\u0000\u03b0\u03b1\u0001\u0000\u0000\u0000\u03b1\u03b2\u0006\u0016\u0005"+ - "\u0000\u03b2A\u0001\u0000\u0000\u0000\u03b3\u03b4\u0004\u0017\u0001\u0000"+ - "\u03b4\u03b5\u0007\u0007\u0000\u0000\u03b5\u03b6\u0007\r\u0000\u0000\u03b6"+ - "\u03b7\u0007\u000b\u0000\u0000\u03b7\u03b8\u0007\u0007\u0000\u0000\u03b8"+ - "\u03b9\u0007\f\u0000\u0000\u03b9\u03ba\u0007\u0005\u0000\u0000\u03ba\u03bb"+ - "\u0007\u0004\u0000\u0000\u03bb\u03bc\u0007\u000e\u0000\u0000\u03bc\u03bd"+ - "\u0001\u0000\u0000\u0000\u03bd\u03be\u0006\u0017\u0005\u0000\u03beC\u0001"+ - "\u0000\u0000\u0000\u03bf\u03c0\u0007\u0016\u0000\u0000\u03c0\u03c1\u0007"+ - "\t\u0000\u0000\u03c1\u03c2\u0007\f\u0000\u0000\u03c2\u03c3\u0007\u0013"+ - "\u0000\u0000\u03c3\u03c4\u0001\u0000\u0000\u0000\u03c4\u03c5\u0006\u0018"+ - "\u0006\u0000\u03c5E\u0001\u0000\u0000\u0000\u03c6\u03c7\u0007\u0016\u0000"+ - "\u0000\u03c7\u03c8\u0007\u0015\u0000\u0000\u03c8\u03c9\u0007\u0011\u0000"+ - "\u0000\u03c9\u03ca\u0007\u0007\u0000\u0000\u03ca\u03cb\u0001\u0000\u0000"+ - "\u0000\u03cb\u03cc\u0006\u0019\u0007\u0000\u03ccG\u0001\u0000\u0000\u0000"+ - "\u03cd\u03ce\u0007\n\u0000\u0000\u03ce\u03cf\u0007\u0005\u0000\u0000\u03cf"+ - "\u03d0\u0007\u000e\u0000\u0000\u03d0\u03d1\u0007\n\u0000\u0000\u03d1\u03d2"+ - "\u0007\u0005\u0000\u0000\u03d2\u03d3\u0007\u0007\u0000\u0000\u03d3\u03d4"+ - "\u0001\u0000\u0000\u0000\u03d4\u03d5\u0006\u001a\b\u0000\u03d5I\u0001"+ - "\u0000\u0000\u0000\u03d6\u03d7\u0007\n\u0000\u0000\u03d7\u03d8\u0007\u0005"+ - "\u0000\u0000\u03d8\u03d9\u0007\u000e\u0000\u0000\u03d9\u03da\u0007\n\u0000"+ - "\u0000\u03da\u03db\u0007\u0005\u0000\u0000\u03db\u03dc\u0007\u0007\u0000"+ - "\u0000\u03dc\u03dd\u0007\u0011\u0000\u0000\u03dd\u03de\u0007\u000b\u0000"+ - "\u0000\u03de\u03df\u0007\u0004\u0000\u0000\u03df\u03e0\u0007\u000b\u0000"+ - "\u0000\u03e0\u03e1\u0007\u0011\u0000\u0000\u03e1\u03e2\u0001\u0000\u0000"+ - "\u0000\u03e2\u03e3\u0006\u001b\u0004\u0000\u03e3K\u0001\u0000\u0000\u0000"+ - "\u03e4\u03e5\u0007\u000e\u0000\u0000\u03e5\u03e6\u0007\t\u0000\u0000\u03e6"+ - "\u03e7\u0007\t\u0000\u0000\u03e7\u03e8\u0007\u0013\u0000\u0000\u03e8\u03e9"+ - "\u0007\u0015\u0000\u0000\u03e9\u03ea\u0007\b\u0000\u0000\u03ea\u03eb\u0001"+ - "\u0000\u0000\u0000\u03eb\u03ec\u0006\u001c\t\u0000\u03ecM\u0001\u0000"+ - "\u0000\u0000\u03ed\u03ee\u0004\u001d\u0002\u0000\u03ee\u03ef\u0007\u0016"+ - "\u0000\u0000\u03ef\u03f0\u0007\u0015\u0000\u0000\u03f0\u03f1\u0007\u000e"+ - "\u0000\u0000\u03f1\u03f2\u0007\u000e\u0000\u0000\u03f2\u03f3\u0001\u0000"+ - "\u0000\u0000\u03f3\u03f4\u0006\u001d\t\u0000\u03f4O\u0001\u0000\u0000"+ - "\u0000\u03f5\u03f6\u0004\u001e\u0003\u0000\u03f6\u03f7\u0007\u000e\u0000"+ - "\u0000\u03f7\u03f8\u0007\u0007\u0000\u0000\u03f8\u03f9\u0007\u0016\u0000"+ - "\u0000\u03f9\u03fa\u0007\u000b\u0000\u0000\u03fa\u03fb\u0001\u0000\u0000"+ - "\u0000\u03fb\u03fc\u0006\u001e\t\u0000\u03fcQ\u0001\u0000\u0000\u0000"+ - "\u03fd\u03fe\u0004\u001f\u0004\u0000\u03fe\u03ff\u0007\f\u0000\u0000\u03ff"+ - "\u0400\u0007\n\u0000\u0000\u0400\u0401\u0007\u0006\u0000\u0000\u0401\u0402"+ - "\u0007\u0003\u0000\u0000\u0402\u0403\u0007\u000b\u0000\u0000\u0403\u0404"+ - "\u0001\u0000\u0000\u0000\u0404\u0405\u0006\u001f\t\u0000\u0405S\u0001"+ - "\u0000\u0000\u0000\u0406\u0407\u0004 \u0005\u0000\u0407\u0408\u0007\u000e"+ - "\u0000\u0000\u0408\u0409\u0007\t\u0000\u0000\u0409\u040a\u0007\t\u0000"+ - "\u0000\u040a\u040b\u0007\u0013\u0000\u0000\u040b\u040c\u0007\u0015\u0000"+ - "\u0000\u040c\u040d\u0007\b\u0000\u0000\u040d\u040e\u0005_\u0000\u0000"+ - "\u040e\u040f\u0005\u8001\uf414\u0000\u0000\u040f\u0410\u0001\u0000\u0000"+ - "\u0000\u0410\u0411\u0006 \n\u0000\u0411U\u0001\u0000\u0000\u0000\u0412"+ - "\u0413\u0007\u000f\u0000\u0000\u0413\u0414\u0007\u000f\u0000\u0000\u0414"+ - "\u0415\u0007\f\u0000\u0000\u0415\u0416\u0001\u0000\u0000\u0000\u0416\u0417"+ - "\u0006!\u000b\u0000\u0417W\u0001\u0000\u0000\u0000\u0418\u0419\u0007\u000f"+ - "\u0000\u0000\u0419\u041a\u0007\u0012\u0000\u0000\u041a\u041b\u0005_\u0000"+ - "\u0000\u041b\u041c\u0007\u0007\u0000\u0000\u041c\u041d\u0007\r\u0000\u0000"+ - "\u041d\u041e\u0007\b\u0000\u0000\u041e\u041f\u0007\u0004\u0000\u0000\u041f"+ - "\u0420\u0007\u0005\u0000\u0000\u0420\u0421\u0007\u0010\u0000\u0000\u0421"+ - "\u0422\u0001\u0000\u0000\u0000\u0422\u0423\u0006\"\f\u0000\u0423Y\u0001"+ - "\u0000\u0000\u0000\u0424\u0425\u0007\u0010\u0000\u0000\u0425\u0426\u0007"+ - "\f\u0000\u0000\u0426\u0427\u0007\t\u0000\u0000\u0427\u0428\u0007\b\u0000"+ - "\u0000\u0428\u0429\u0001\u0000\u0000\u0000\u0429\u042a\u0006#\r\u0000"+ - "\u042a[\u0001\u0000\u0000\u0000\u042b\u042c\u0007\u0013\u0000\u0000\u042c"+ - "\u042d\u0007\u0007\u0000\u0000\u042d\u042e\u0007\u0007\u0000\u0000\u042e"+ - "\u042f\u0007\b\u0000\u0000\u042f\u0430\u0001\u0000\u0000\u0000\u0430\u0431"+ - "\u0006$\r\u0000\u0431]\u0001\u0000\u0000\u0000\u0432\u0433\u0004%\u0006"+ - "\u0000\u0433\u0434\u0007\n\u0000\u0000\u0434\u0435\u0007\u0005\u0000\u0000"+ - "\u0435\u0436\u0007\u0011\u0000\u0000\u0436\u0437\u0007\n\u0000\u0000\u0437"+ - "\u0438\u0007\u0011\u0000\u0000\u0438\u0439\u0007\u000b\u0000\u0000\u0439"+ - "\u043a\u0005_\u0000\u0000\u043a\u043b\u0005\u8001\uf414\u0000\u0000\u043b"+ - "\u043c\u0001\u0000\u0000\u0000\u043c\u043d\u0006%\r\u0000\u043d_\u0001"+ - "\u0000\u0000\u0000\u043e\u043f\u0007\b\u0000\u0000\u043f\u0440\u0007\f"+ - "\u0000\u0000\u0440\u0441\u0007\t\u0000\u0000\u0441\u0442\u0007\u000f\u0000"+ - "\u0000\u0442\u0443\u0007\u0017\u0000\u0000\u0443\u0444\u0007\u000e\u0000"+ - "\u0000\u0444\u0445\u0001\u0000\u0000\u0000\u0445\u0446\u0006&\u000e\u0000"+ - "\u0446a\u0001\u0000\u0000\u0000\u0447\u0448\u0007\f\u0000\u0000\u0448"+ - "\u0449\u0007\u0007\u0000\u0000\u0449\u044a\u0007\u0005\u0000\u0000\u044a"+ - "\u044b\u0007\u0004\u0000\u0000\u044b\u044c\u0007\u000f\u0000\u0000\u044c"+ - "\u044d\u0007\u0007\u0000\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e"+ - "\u044f\u0006\'\u000f\u0000\u044fc\u0001\u0000\u0000\u0000\u0450\u0451"+ - "\u0007\u0011\u0000\u0000\u0451\u0452\u0007\u0007\u0000\u0000\u0452\u0453"+ - "\u0007\u000b\u0000\u0000\u0453\u0454\u0001\u0000\u0000\u0000\u0454\u0455"+ - "\u0006(\u0010\u0000\u0455e\u0001\u0000\u0000\u0000\u0456\u0457\u0007\u0011"+ - "\u0000\u0000\u0457\u0458\u0007\u0003\u0000\u0000\u0458\u0459\u0007\t\u0000"+ - "\u0000\u0459\u045a\u0007\u0014\u0000\u0000\u045a\u045b\u0001\u0000\u0000"+ - "\u0000\u045b\u045c\u0006)\u0011\u0000\u045cg\u0001\u0000\u0000\u0000\u045d"+ - "\u045f\b\u0018\u0000\u0000\u045e\u045d\u0001\u0000\u0000\u0000\u045f\u0460"+ - "\u0001\u0000\u0000\u0000\u0460\u045e\u0001\u0000\u0000\u0000\u0460\u0461"+ - "\u0001\u0000\u0000\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463"+ - "\u0006*\u0004\u0000\u0463i\u0001\u0000\u0000\u0000\u0464\u0465\u0003\u00c6"+ - "Y\u0000\u0465\u0466\u0001\u0000\u0000\u0000\u0466\u0467\u0006+\u0012\u0000"+ - "\u0467\u0468\u0006+\u0013\u0000\u0468k\u0001\u0000\u0000\u0000\u0469\u046a"+ - "\u0003\u013e\u0095\u0000\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u046c"+ - "\u0006,\u0014\u0000\u046c\u046d\u0006,\u0013\u0000\u046d\u046e\u0006,"+ - "\u0013\u0000\u046em\u0001\u0000\u0000\u0000\u046f\u0470\u0003\u0108z\u0000"+ - "\u0470\u0471\u0001\u0000\u0000\u0000\u0471\u0472\u0006-\u0015\u0000\u0472"+ - "o\u0001\u0000\u0000\u0000\u0473\u0474\u0003\u0282\u0137\u0000\u0474\u0475"+ - "\u0001\u0000\u0000\u0000\u0475\u0476\u0006.\u0016\u0000\u0476q\u0001\u0000"+ - "\u0000\u0000\u0477\u0478\u0003\u00f4p\u0000\u0478\u0479\u0001\u0000\u0000"+ - "\u0000\u0479\u047a\u0006/\u0017\u0000\u047as\u0001\u0000\u0000\u0000\u047b"+ - "\u047c\u0003\u00f0n\u0000\u047c\u047d\u0001\u0000\u0000\u0000\u047d\u047e"+ - "\u00060\u0018\u0000\u047eu\u0001\u0000\u0000\u0000\u047f\u0480\u0003\u0138"+ - "\u0092\u0000\u0480\u0481\u0001\u0000\u0000\u0000\u0481\u0482\u00061\u0019"+ - "\u0000\u0482w\u0001\u0000\u0000\u0000\u0483\u0484\u0003\u013a\u0093\u0000"+ - "\u0484\u0485\u0001\u0000\u0000\u0000\u0485\u0486\u00062\u001a\u0000\u0486"+ - "y\u0001\u0000\u0000\u0000\u0487\u0488\u0003\u0144\u0098\u0000\u0488\u0489"+ - "\u0001\u0000\u0000\u0000\u0489\u048a\u00063\u001b\u0000\u048a{\u0001\u0000"+ - "\u0000\u0000\u048b\u048c\u0003\u0140\u0096\u0000\u048c\u048d\u0001\u0000"+ - "\u0000\u0000\u048d\u048e\u00064\u001c\u0000\u048e}\u0001\u0000\u0000\u0000"+ - "\u048f\u0490\u0003\u0014\u0000\u0000\u0490\u0491\u0001\u0000\u0000\u0000"+ - "\u0491\u0492\u00065\u0000\u0000\u0492\u007f\u0001\u0000\u0000\u0000\u0493"+ - "\u0494\u0003\u0016\u0001\u0000\u0494\u0495\u0001\u0000\u0000\u0000\u0495"+ - "\u0496\u00066\u0000\u0000\u0496\u0081\u0001\u0000\u0000\u0000\u0497\u0498"+ - "\u0003\u0018\u0002\u0000\u0498\u0499\u0001\u0000\u0000\u0000\u0499\u049a"+ - "\u00067\u0000\u0000\u049a\u0083\u0001\u0000\u0000\u0000\u049b\u049c\u0003"+ - "\u00c6Y\u0000\u049c\u049d\u0001\u0000\u0000\u0000\u049d\u049e\u00068\u0012"+ - "\u0000\u049e\u049f\u00068\u0013\u0000\u049f\u0085\u0001\u0000\u0000\u0000"+ - "\u04a0\u04a1\u0003\u013e\u0095\u0000\u04a1\u04a2\u0001\u0000\u0000\u0000"+ - "\u04a2\u04a3\u00069\u0014\u0000\u04a3\u04a4\u00069\u0013\u0000\u04a4\u04a5"+ - "\u00069\u0013\u0000\u04a5\u0087\u0001\u0000\u0000\u0000\u04a6\u04a7\u0003"+ - "\u0108z\u0000\u04a7\u04a8\u0001\u0000\u0000\u0000\u04a8\u04a9\u0006:\u0015"+ - "\u0000\u04a9\u04aa\u0006:\u001d\u0000\u04aa\u0089\u0001\u0000\u0000\u0000"+ - "\u04ab\u04ac\u0003\u0112\u007f\u0000\u04ac\u04ad\u0001\u0000\u0000\u0000"+ - "\u04ad\u04ae\u0006;\u001e\u0000\u04ae\u04af\u0006;\u001d\u0000\u04af\u008b"+ - "\u0001\u0000\u0000\u0000\u04b0\u04b1\b\u0019\u0000\u0000\u04b1\u008d\u0001"+ - "\u0000\u0000\u0000\u04b2\u04b4\u0003\u008c<\u0000\u04b3\u04b2\u0001\u0000"+ - "\u0000\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b3\u0001\u0000"+ - "\u0000\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b7\u0001\u0000"+ - "\u0000\u0000\u04b7\u04b8\u0003\u00ecl\u0000\u04b8\u04ba\u0001\u0000\u0000"+ - "\u0000\u04b9\u04b3\u0001\u0000\u0000\u0000\u04b9\u04ba\u0001\u0000\u0000"+ - "\u0000\u04ba\u04bc\u0001\u0000\u0000\u0000\u04bb\u04bd\u0003\u008c<\u0000"+ - "\u04bc\u04bb\u0001\u0000\u0000\u0000\u04bd\u04be\u0001\u0000\u0000\u0000"+ - "\u04be\u04bc\u0001\u0000\u0000\u0000\u04be\u04bf\u0001\u0000\u0000\u0000"+ - "\u04bf\u008f\u0001\u0000\u0000\u0000\u04c0\u04c1\u0003\u008e=\u0000\u04c1"+ - "\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0006>\u001f\u0000\u04c3\u0091"+ - "\u0001\u0000\u0000\u0000\u04c4\u04c5\u0003\u00dcd\u0000\u04c5\u04c6\u0001"+ - "\u0000\u0000\u0000\u04c6\u04c7\u0006? \u0000\u04c7\u0093\u0001\u0000\u0000"+ - "\u0000\u04c8\u04c9\u0003\u0014\u0000\u0000\u04c9\u04ca\u0001\u0000\u0000"+ - "\u0000\u04ca\u04cb\u0006@\u0000\u0000\u04cb\u0095\u0001\u0000\u0000\u0000"+ - "\u04cc\u04cd\u0003\u0016\u0001\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000"+ - "\u04ce\u04cf\u0006A\u0000\u0000\u04cf\u0097\u0001\u0000\u0000\u0000\u04d0"+ - "\u04d1\u0003\u0018\u0002\u0000\u04d1\u04d2\u0001\u0000\u0000\u0000\u04d2"+ - "\u04d3\u0006B\u0000\u0000\u04d3\u0099\u0001\u0000\u0000\u0000\u04d4\u04d5"+ - "\u0003\u00c6Y\u0000\u04d5\u04d6\u0001\u0000\u0000\u0000\u04d6\u04d7\u0006"+ - "C\u0012\u0000\u04d7\u04d8\u0006C\u0013\u0000\u04d8\u04d9\u0006C\u0013"+ - "\u0000\u04d9\u009b\u0001\u0000\u0000\u0000\u04da\u04db\u0003\u013e\u0095"+ - "\u0000\u04db\u04dc\u0001\u0000\u0000\u0000\u04dc\u04dd\u0006D\u0014\u0000"+ - "\u04dd\u04de\u0006D\u0013\u0000\u04de\u04df\u0006D\u0013\u0000\u04df\u04e0"+ - "\u0006D\u0013\u0000\u04e0\u009d\u0001\u0000\u0000\u0000\u04e1\u04e2\u0003"+ - "\u0138\u0092\u0000\u04e2\u04e3\u0001\u0000\u0000\u0000\u04e3\u04e4\u0006"+ - "E\u0019\u0000\u04e4\u009f\u0001\u0000\u0000\u0000\u04e5\u04e6\u0003\u013a"+ - "\u0093\u0000\u04e6\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0006F\u001a"+ - "\u0000\u04e8\u00a1\u0001\u0000\u0000\u0000\u04e9\u04ea\u0003\u00e6i\u0000"+ - "\u04ea\u04eb\u0001\u0000\u0000\u0000\u04eb\u04ec\u0006G!\u0000\u04ec\u00a3"+ - "\u0001\u0000\u0000\u0000\u04ed\u04ee\u0003\u00f0n\u0000\u04ee\u04ef\u0001"+ - "\u0000\u0000\u0000\u04ef\u04f0\u0006H\u0018\u0000\u04f0\u00a5\u0001\u0000"+ - "\u0000\u0000\u04f1\u04f2\u0003\u00f4p\u0000\u04f2\u04f3\u0001\u0000\u0000"+ - "\u0000\u04f3\u04f4\u0006I\u0017\u0000\u04f4\u00a7\u0001\u0000\u0000\u0000"+ - "\u04f5\u04f6\u0003\u0112\u007f\u0000\u04f6\u04f7\u0001\u0000\u0000\u0000"+ - "\u04f7\u04f8\u0006J\u001e\u0000\u04f8\u00a9\u0001\u0000\u0000\u0000\u04f9"+ - "\u04fa\u0003\u023e\u0115\u0000\u04fa\u04fb\u0001\u0000\u0000\u0000\u04fb"+ - "\u04fc\u0006K\"\u0000\u04fc\u00ab\u0001\u0000\u0000\u0000\u04fd\u04fe"+ - "\u0003\u0144\u0098\u0000\u04fe\u04ff\u0001\u0000\u0000\u0000\u04ff\u0500"+ - "\u0006L\u001b\u0000\u0500\u00ad\u0001\u0000\u0000\u0000\u0501\u0502\u0003"+ - "\u010c|\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503\u0504\u0006M#"+ - "\u0000\u0504\u00af\u0001\u0000\u0000\u0000\u0505\u0506\u0003\u0134\u0090"+ - "\u0000\u0506\u0507\u0001\u0000\u0000\u0000\u0507\u0508\u0006N$\u0000\u0508"+ - "\u00b1\u0001\u0000\u0000\u0000\u0509\u050a\u0003\u0130\u008e\u0000\u050a"+ - "\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0006O%\u0000\u050c\u00b3\u0001"+ - "\u0000\u0000\u0000\u050d\u050e\u0003\u0136\u0091\u0000\u050e\u050f\u0001"+ - "\u0000\u0000\u0000\u050f\u0510\u0006P&\u0000\u0510\u00b5\u0001\u0000\u0000"+ - "\u0000\u0511\u0512\u0003\u0014\u0000\u0000\u0512\u0513\u0001\u0000\u0000"+ - "\u0000\u0513\u0514\u0006Q\u0000\u0000\u0514\u00b7\u0001\u0000\u0000\u0000"+ - "\u0515\u0516\u0003\u0016\u0001\u0000\u0516\u0517\u0001\u0000\u0000\u0000"+ - "\u0517\u0518\u0006R\u0000\u0000\u0518\u00b9\u0001\u0000\u0000\u0000\u0519"+ - "\u051a\u0003\u0018\u0002\u0000\u051a\u051b\u0001\u0000\u0000\u0000\u051b"+ - "\u051c\u0006S\u0000\u0000\u051c\u00bb\u0001\u0000\u0000\u0000\u051d\u051e"+ - "\u0003\u013c\u0094\u0000\u051e\u051f\u0001\u0000\u0000\u0000\u051f\u0520"+ - "\u0006T\'\u0000\u0520\u0521\u0006T(\u0000\u0521\u00bd\u0001\u0000\u0000"+ - "\u0000\u0522\u0523\u0003\u00c6Y\u0000\u0523\u0524\u0001\u0000\u0000\u0000"+ - "\u0524\u0525\u0006U\u0012\u0000\u0525\u0526\u0006U\u0013\u0000\u0526\u00bf"+ - "\u0001\u0000\u0000\u0000\u0527\u0528\u0003\u0018\u0002\u0000\u0528\u0529"+ - "\u0001\u0000\u0000\u0000\u0529\u052a\u0006V\u0000\u0000\u052a\u00c1\u0001"+ - "\u0000\u0000\u0000\u052b\u052c\u0003\u0014\u0000\u0000\u052c\u052d\u0001"+ - "\u0000\u0000\u0000\u052d\u052e\u0006W\u0000\u0000\u052e\u00c3\u0001\u0000"+ - "\u0000\u0000\u052f\u0530\u0003\u0016\u0001\u0000\u0530\u0531\u0001\u0000"+ - "\u0000\u0000\u0531\u0532\u0006X\u0000\u0000\u0532\u00c5\u0001\u0000\u0000"+ - "\u0000\u0533\u0534\u0005|\u0000\u0000\u0534\u0535\u0001\u0000\u0000\u0000"+ - "\u0535\u0536\u0006Y\u0013\u0000\u0536\u00c7\u0001\u0000\u0000\u0000\u0537"+ - "\u0538\u0007\u001a\u0000\u0000\u0538\u00c9\u0001\u0000\u0000\u0000\u0539"+ - "\u053a\u0007\u001b\u0000\u0000\u053a\u00cb\u0001\u0000\u0000\u0000\u053b"+ - "\u053c\u0005\\\u0000\u0000\u053c\u053d\u0007\u001c\u0000\u0000\u053d\u00cd"+ - "\u0001\u0000\u0000\u0000\u053e\u053f\b\u001d\u0000\u0000\u053f\u00cf\u0001"+ - "\u0000\u0000\u0000\u0540\u0542\u0007\u0007\u0000\u0000\u0541\u0543\u0007"+ - "\u001e\u0000\u0000\u0542\u0541\u0001\u0000\u0000\u0000\u0542\u0543\u0001"+ - "\u0000\u0000\u0000\u0543\u0545\u0001\u0000\u0000\u0000\u0544\u0546\u0003"+ - "\u00c8Z\u0000\u0545\u0544\u0001\u0000\u0000\u0000\u0546\u0547\u0001\u0000"+ - "\u0000\u0000\u0547\u0545\u0001\u0000\u0000\u0000\u0547\u0548\u0001\u0000"+ - "\u0000\u0000\u0548\u00d1\u0001\u0000\u0000\u0000\u0549\u054a\u0005@\u0000"+ - "\u0000\u054a\u00d3\u0001\u0000\u0000\u0000\u054b\u054c\u0005`\u0000\u0000"+ - "\u054c\u00d5\u0001\u0000\u0000\u0000\u054d\u0551\b\u001f\u0000\u0000\u054e"+ - "\u054f\u0005`\u0000\u0000\u054f\u0551\u0005`\u0000\u0000\u0550\u054d\u0001"+ - "\u0000\u0000\u0000\u0550\u054e\u0001\u0000\u0000\u0000\u0551\u00d7\u0001"+ - "\u0000\u0000\u0000\u0552\u0553\u0005_\u0000\u0000\u0553\u00d9\u0001\u0000"+ - "\u0000\u0000\u0554\u0558\u0003\u00ca[\u0000\u0555\u0558\u0003\u00c8Z\u0000"+ - "\u0556\u0558\u0003\u00d8b\u0000\u0557\u0554\u0001\u0000\u0000\u0000\u0557"+ - "\u0555\u0001\u0000\u0000\u0000\u0557\u0556\u0001\u0000\u0000\u0000\u0558"+ - "\u00db\u0001\u0000\u0000\u0000\u0559\u055e\u0005\"\u0000\u0000\u055a\u055d"+ - "\u0003\u00cc\\\u0000\u055b\u055d\u0003\u00ce]\u0000\u055c\u055a\u0001"+ - "\u0000\u0000\u0000\u055c\u055b\u0001\u0000\u0000\u0000\u055d\u0560\u0001"+ - "\u0000\u0000\u0000\u055e\u055c\u0001\u0000\u0000\u0000\u055e\u055f\u0001"+ - "\u0000\u0000\u0000\u055f\u0561\u0001\u0000\u0000\u0000\u0560\u055e\u0001"+ - "\u0000\u0000\u0000\u0561\u0577\u0005\"\u0000\u0000\u0562\u0563\u0005\""+ - "\u0000\u0000\u0563\u0564\u0005\"\u0000\u0000\u0564\u0565\u0005\"\u0000"+ - "\u0000\u0565\u0569\u0001\u0000\u0000\u0000\u0566\u0568\b\u0000\u0000\u0000"+ - "\u0567\u0566\u0001\u0000\u0000\u0000\u0568\u056b\u0001\u0000\u0000\u0000"+ - "\u0569\u056a\u0001\u0000\u0000\u0000\u0569\u0567\u0001\u0000\u0000\u0000"+ - "\u056a\u056c\u0001\u0000\u0000\u0000\u056b\u0569\u0001\u0000\u0000\u0000"+ - "\u056c\u056d\u0005\"\u0000\u0000\u056d\u056e\u0005\"\u0000\u0000\u056e"+ - "\u056f\u0005\"\u0000\u0000\u056f\u0571\u0001\u0000\u0000\u0000\u0570\u0572"+ - "\u0005\"\u0000\u0000\u0571\u0570\u0001\u0000\u0000\u0000\u0571\u0572\u0001"+ - "\u0000\u0000\u0000\u0572\u0574\u0001\u0000\u0000\u0000\u0573\u0575\u0005"+ - "\"\u0000\u0000\u0574\u0573\u0001\u0000\u0000\u0000\u0574\u0575\u0001\u0000"+ - "\u0000\u0000\u0575\u0577\u0001\u0000\u0000\u0000\u0576\u0559\u0001\u0000"+ - "\u0000\u0000\u0576\u0562\u0001\u0000\u0000\u0000\u0577\u00dd\u0001\u0000"+ - "\u0000\u0000\u0578\u057a\u0003\u00c8Z\u0000\u0579\u0578\u0001\u0000\u0000"+ - "\u0000\u057a\u057b\u0001\u0000\u0000\u0000\u057b\u0579\u0001\u0000\u0000"+ - "\u0000\u057b\u057c\u0001\u0000\u0000\u0000\u057c\u00df\u0001\u0000\u0000"+ - "\u0000\u057d\u057f\u0003\u00c8Z\u0000\u057e\u057d\u0001\u0000\u0000\u0000"+ - "\u057f\u0580\u0001\u0000\u0000\u0000\u0580\u057e\u0001\u0000\u0000\u0000"+ - "\u0580\u0581\u0001\u0000\u0000\u0000\u0581\u0582\u0001\u0000\u0000\u0000"+ - "\u0582\u0586\u0003\u00f4p\u0000\u0583\u0585\u0003\u00c8Z\u0000\u0584\u0583"+ - "\u0001\u0000\u0000\u0000\u0585\u0588\u0001\u0000\u0000\u0000\u0586\u0584"+ - "\u0001\u0000\u0000\u0000\u0586\u0587\u0001\u0000\u0000\u0000\u0587\u05a8"+ - "\u0001\u0000\u0000\u0000\u0588\u0586\u0001\u0000\u0000\u0000\u0589\u058b"+ - "\u0003\u00f4p\u0000\u058a\u058c\u0003\u00c8Z\u0000\u058b\u058a\u0001\u0000"+ - "\u0000\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d\u058b\u0001\u0000"+ - "\u0000\u0000\u058d\u058e\u0001\u0000\u0000\u0000\u058e\u05a8\u0001\u0000"+ - "\u0000\u0000\u058f\u0591\u0003\u00c8Z\u0000\u0590\u058f\u0001\u0000\u0000"+ - "\u0000\u0591\u0592\u0001\u0000\u0000\u0000\u0592\u0590\u0001\u0000\u0000"+ - "\u0000\u0592\u0593\u0001\u0000\u0000\u0000\u0593\u059b\u0001\u0000\u0000"+ - "\u0000\u0594\u0598\u0003\u00f4p\u0000\u0595\u0597\u0003\u00c8Z\u0000\u0596"+ - "\u0595\u0001\u0000\u0000\u0000\u0597\u059a\u0001\u0000\u0000\u0000\u0598"+ - "\u0596\u0001\u0000\u0000\u0000\u0598\u0599\u0001\u0000\u0000\u0000\u0599"+ - "\u059c\u0001\u0000\u0000\u0000\u059a\u0598\u0001\u0000\u0000\u0000\u059b"+ - "\u0594\u0001\u0000\u0000\u0000\u059b\u059c\u0001\u0000\u0000\u0000\u059c"+ - "\u059d\u0001\u0000\u0000\u0000\u059d\u059e\u0003\u00d0^\u0000\u059e\u05a8"+ - "\u0001\u0000\u0000\u0000\u059f\u05a1\u0003\u00f4p\u0000\u05a0\u05a2\u0003"+ - "\u00c8Z\u0000\u05a1\u05a0\u0001\u0000\u0000\u0000\u05a2\u05a3\u0001\u0000"+ - "\u0000\u0000\u05a3\u05a1\u0001\u0000\u0000\u0000\u05a3\u05a4\u0001\u0000"+ - "\u0000\u0000\u05a4\u05a5\u0001\u0000\u0000\u0000\u05a5\u05a6\u0003\u00d0"+ - "^\u0000\u05a6\u05a8\u0001\u0000\u0000\u0000\u05a7\u057e\u0001\u0000\u0000"+ - "\u0000\u05a7\u0589\u0001\u0000\u0000\u0000\u05a7\u0590\u0001\u0000\u0000"+ - "\u0000\u05a7\u059f\u0001\u0000\u0000\u0000\u05a8\u00e1\u0001\u0000\u0000"+ - "\u0000\u05a9\u05aa\u0007\u0004\u0000\u0000\u05aa\u05ab\u0007\u0005\u0000"+ - "\u0000\u05ab\u05ac\u0007\u0010\u0000\u0000\u05ac\u00e3\u0001\u0000\u0000"+ - "\u0000\u05ad\u05ae\u0007\u0004\u0000\u0000\u05ae\u05af\u0007\u0011\u0000"+ - "\u0000\u05af\u05b0\u0007\u0002\u0000\u0000\u05b0\u00e5\u0001\u0000\u0000"+ - "\u0000\u05b1\u05b2\u0005=\u0000\u0000\u05b2\u00e7\u0001\u0000\u0000\u0000"+ - "\u05b3\u05b4\u0007 \u0000\u0000\u05b4\u05b5\u0007!\u0000\u0000\u05b5\u00e9"+ - "\u0001\u0000\u0000\u0000\u05b6\u05b7\u0005:\u0000\u0000\u05b7\u05b8\u0005"+ - ":\u0000\u0000\u05b8\u00eb\u0001\u0000\u0000\u0000\u05b9\u05ba\u0005:\u0000"+ - "\u0000\u05ba\u00ed\u0001\u0000\u0000\u0000\u05bb\u05bc\u0005;\u0000\u0000"+ - "\u05bc\u00ef\u0001\u0000\u0000\u0000\u05bd\u05be\u0005,\u0000\u0000\u05be"+ - "\u00f1\u0001\u0000\u0000\u0000\u05bf\u05c0\u0007\u0010\u0000\u0000\u05c0"+ - "\u05c1\u0007\u0007\u0000\u0000\u05c1\u05c2\u0007\u0011\u0000\u0000\u05c2"+ - "\u05c3\u0007\u0002\u0000\u0000\u05c3\u00f3\u0001\u0000\u0000\u0000\u05c4"+ - "\u05c5\u0005.\u0000\u0000\u05c5\u00f5\u0001\u0000\u0000\u0000\u05c6\u05c7"+ - "\u0007\u0016\u0000\u0000\u05c7\u05c8\u0007\u0004\u0000\u0000\u05c8\u05c9"+ - "\u0007\u000e\u0000\u0000\u05c9\u05ca\u0007\u0011\u0000\u0000\u05ca\u05cb"+ - "\u0007\u0007\u0000\u0000\u05cb\u00f7\u0001\u0000\u0000\u0000\u05cc\u05cd"+ - "\u0007\u0016\u0000\u0000\u05cd\u05ce\u0007\n\u0000\u0000\u05ce\u05cf\u0007"+ - "\f\u0000\u0000\u05cf\u05d0\u0007\u0011\u0000\u0000\u05d0\u05d1\u0007\u000b"+ - "\u0000\u0000\u05d1\u00f9\u0001\u0000\u0000\u0000\u05d2\u05d3\u0007\n\u0000"+ - "\u0000\u05d3\u05d4\u0007\u0005\u0000\u0000\u05d4\u00fb\u0001\u0000\u0000"+ - "\u0000\u05d5\u05d6\u0007\n\u0000\u0000\u05d6\u05d7\u0007\u0011\u0000\u0000"+ - "\u05d7\u00fd\u0001\u0000\u0000\u0000\u05d8\u05d9\u0007\u000e\u0000\u0000"+ - "\u05d9\u05da\u0007\u0004\u0000\u0000\u05da\u05db\u0007\u0011\u0000\u0000"+ - "\u05db\u05dc\u0007\u000b\u0000\u0000\u05dc\u00ff\u0001\u0000\u0000\u0000"+ - "\u05dd\u05de\u0007\u000e\u0000\u0000\u05de\u05df\u0007\n\u0000\u0000\u05df"+ - "\u05e0\u0007\u0013\u0000\u0000\u05e0\u05e1\u0007\u0007\u0000\u0000\u05e1"+ - "\u0101\u0001\u0000\u0000\u0000\u05e2\u05e3\u0007\u0005\u0000\u0000\u05e3"+ - "\u05e4\u0007\t\u0000\u0000\u05e4\u05e5\u0007\u000b\u0000\u0000\u05e5\u0103"+ - "\u0001\u0000\u0000\u0000\u05e6\u05e7\u0007\u0005\u0000\u0000\u05e7\u05e8"+ - "\u0007\u0015\u0000\u0000\u05e8\u05e9\u0007\u000e\u0000\u0000\u05e9\u05ea"+ - "\u0007\u000e\u0000\u0000\u05ea\u0105\u0001\u0000\u0000\u0000\u05eb\u05ec"+ - "\u0007\u0005\u0000\u0000\u05ec\u05ed\u0007\u0015\u0000\u0000\u05ed\u05ee"+ - "\u0007\u000e\u0000\u0000\u05ee\u05ef\u0007\u000e\u0000\u0000\u05ef\u05f0"+ - "\u0007\u0011\u0000\u0000\u05f0\u0107\u0001\u0000\u0000\u0000\u05f1\u05f2"+ - "\u0007\t\u0000\u0000\u05f2\u05f3\u0007\u0005\u0000\u0000\u05f3\u0109\u0001"+ - "\u0000\u0000\u0000\u05f4\u05f5\u0007\t\u0000\u0000\u05f5\u05f6\u0007\f"+ - "\u0000\u0000\u05f6\u010b\u0001\u0000\u0000\u0000\u05f7\u05f8\u0005?\u0000"+ - "\u0000\u05f8\u010d\u0001\u0000\u0000\u0000\u05f9\u05fa\u0007\f\u0000\u0000"+ - "\u05fa\u05fb\u0007\u000e\u0000\u0000\u05fb\u05fc\u0007\n\u0000\u0000\u05fc"+ - "\u05fd\u0007\u0013\u0000\u0000\u05fd\u05fe\u0007\u0007\u0000\u0000\u05fe"+ - "\u010f\u0001\u0000\u0000\u0000\u05ff\u0600\u0007\u000b\u0000\u0000\u0600"+ - "\u0601\u0007\f\u0000\u0000\u0601\u0602\u0007\u0015\u0000\u0000\u0602\u0603"+ - "\u0007\u0007\u0000\u0000\u0603\u0111\u0001\u0000\u0000\u0000\u0604\u0605"+ - "\u0007\u0014\u0000\u0000\u0605\u0606\u0007\n\u0000\u0000\u0606\u0607\u0007"+ - "\u000b\u0000\u0000\u0607\u0608\u0007\u0003\u0000\u0000\u0608\u0113\u0001"+ - "\u0000\u0000\u0000\u0609\u060a\u0005=\u0000\u0000\u060a\u060b\u0005=\u0000"+ - "\u0000\u060b\u0115\u0001\u0000\u0000\u0000\u060c\u060d\u0005=\u0000\u0000"+ - "\u060d\u060e\u0005~\u0000\u0000\u060e\u0117\u0001\u0000\u0000\u0000\u060f"+ - "\u0610\u0005!\u0000\u0000\u0610\u0611\u0005=\u0000\u0000\u0611\u0119\u0001"+ - "\u0000\u0000\u0000\u0612\u0613\u0005<\u0000\u0000\u0613\u011b\u0001\u0000"+ - "\u0000\u0000\u0614\u0615\u0005<\u0000\u0000\u0615\u0616\u0005=\u0000\u0000"+ - "\u0616\u011d\u0001\u0000\u0000\u0000\u0617\u0618\u0005>\u0000\u0000\u0618"+ - "\u011f\u0001\u0000\u0000\u0000\u0619\u061a\u0005>\u0000\u0000\u061a\u061b"+ - "\u0005=\u0000\u0000\u061b\u0121\u0001\u0000\u0000\u0000\u061c\u061d\u0005"+ - "+\u0000\u0000\u061d\u0123\u0001\u0000\u0000\u0000\u061e\u061f\u0005-\u0000"+ - "\u0000\u061f\u0125\u0001\u0000\u0000\u0000\u0620\u0621\u0005*\u0000\u0000"+ - "\u0621\u0127\u0001\u0000\u0000\u0000\u0622\u0623\u0005/\u0000\u0000\u0623"+ - "\u0129\u0001\u0000\u0000\u0000\u0624\u0625\u0005%\u0000\u0000\u0625\u012b"+ - "\u0001\u0000\u0000\u0000\u0626\u0627\u0005{\u0000\u0000\u0627\u012d\u0001"+ - "\u0000\u0000\u0000\u0628\u0629\u0005}\u0000\u0000\u0629\u012f\u0001\u0000"+ - "\u0000\u0000\u062a\u062b\u0005?\u0000\u0000\u062b\u062c\u0005?\u0000\u0000"+ - "\u062c\u0131\u0001\u0000\u0000\u0000\u062d\u062e\u00034\u0010\u0000\u062e"+ - "\u062f\u0001\u0000\u0000\u0000\u062f\u0630\u0006\u008f)\u0000\u0630\u0133"+ - "\u0001\u0000\u0000\u0000\u0631\u0634\u0003\u010c|\u0000\u0632\u0635\u0003"+ - "\u00ca[\u0000\u0633\u0635\u0003\u00d8b\u0000\u0634\u0632\u0001\u0000\u0000"+ - "\u0000\u0634\u0633\u0001\u0000\u0000\u0000\u0635\u0639\u0001\u0000\u0000"+ - "\u0000\u0636\u0638\u0003\u00dac\u0000\u0637\u0636\u0001\u0000\u0000\u0000"+ - "\u0638\u063b\u0001\u0000\u0000\u0000\u0639\u0637\u0001\u0000\u0000\u0000"+ - "\u0639\u063a\u0001\u0000\u0000\u0000\u063a\u0643\u0001\u0000\u0000\u0000"+ - "\u063b\u0639\u0001\u0000\u0000\u0000\u063c\u063e\u0003\u010c|\u0000\u063d"+ - "\u063f\u0003\u00c8Z\u0000\u063e\u063d\u0001\u0000\u0000\u0000\u063f\u0640"+ - "\u0001\u0000\u0000\u0000\u0640\u063e\u0001\u0000\u0000\u0000\u0640\u0641"+ - "\u0001\u0000\u0000\u0000\u0641\u0643\u0001\u0000\u0000\u0000\u0642\u0631"+ - "\u0001\u0000\u0000\u0000\u0642\u063c\u0001\u0000\u0000\u0000\u0643\u0135"+ - "\u0001\u0000\u0000\u0000\u0644\u0647\u0003\u0130\u008e\u0000\u0645\u0648"+ - "\u0003\u00ca[\u0000\u0646\u0648\u0003\u00d8b\u0000\u0647\u0645\u0001\u0000"+ - "\u0000\u0000\u0647\u0646\u0001\u0000\u0000\u0000\u0648\u064c\u0001\u0000"+ - "\u0000\u0000\u0649\u064b\u0003\u00dac\u0000\u064a\u0649\u0001\u0000\u0000"+ - "\u0000\u064b\u064e\u0001\u0000\u0000\u0000\u064c\u064a\u0001\u0000\u0000"+ - "\u0000\u064c\u064d\u0001\u0000\u0000\u0000\u064d\u0656\u0001\u0000\u0000"+ - "\u0000\u064e\u064c\u0001\u0000\u0000\u0000\u064f\u0651\u0003\u0130\u008e"+ - "\u0000\u0650\u0652\u0003\u00c8Z\u0000\u0651\u0650\u0001\u0000\u0000\u0000"+ - "\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0651\u0001\u0000\u0000\u0000"+ - "\u0653\u0654\u0001\u0000\u0000\u0000\u0654\u0656\u0001\u0000\u0000\u0000"+ - "\u0655\u0644\u0001\u0000\u0000\u0000\u0655\u064f\u0001\u0000\u0000\u0000"+ - "\u0656\u0137\u0001\u0000\u0000\u0000\u0657\u0658\u0005[\u0000\u0000\u0658"+ - "\u0659\u0001\u0000\u0000\u0000\u0659\u065a\u0006\u0092\u0004\u0000\u065a"+ - "\u065b\u0006\u0092\u0004\u0000\u065b\u0139\u0001\u0000\u0000\u0000\u065c"+ - "\u065d\u0005]\u0000\u0000\u065d\u065e\u0001\u0000\u0000\u0000\u065e\u065f"+ - "\u0006\u0093\u0013\u0000\u065f\u0660\u0006\u0093\u0013\u0000\u0660\u013b"+ - "\u0001\u0000\u0000\u0000\u0661\u0662\u0005(\u0000\u0000\u0662\u0663\u0001"+ - "\u0000\u0000\u0000\u0663\u0664\u0006\u0094\u0004\u0000\u0664\u0665\u0006"+ - "\u0094\u0004\u0000\u0665\u013d\u0001\u0000\u0000\u0000\u0666\u0667\u0005"+ - ")\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668\u0669\u0006\u0095"+ - "\u0013\u0000\u0669\u066a\u0006\u0095\u0013\u0000\u066a\u013f\u0001\u0000"+ - "\u0000\u0000\u066b\u066f\u0003\u00ca[\u0000\u066c\u066e\u0003\u00dac\u0000"+ - "\u066d\u066c\u0001\u0000\u0000\u0000\u066e\u0671\u0001\u0000\u0000\u0000"+ - "\u066f\u066d\u0001\u0000\u0000\u0000\u066f\u0670\u0001\u0000\u0000\u0000"+ - "\u0670\u067c\u0001\u0000\u0000\u0000\u0671\u066f\u0001\u0000\u0000\u0000"+ - "\u0672\u0675\u0003\u00d8b\u0000\u0673\u0675\u0003\u00d2_\u0000\u0674\u0672"+ - "\u0001\u0000\u0000\u0000\u0674\u0673\u0001\u0000\u0000\u0000\u0675\u0677"+ - "\u0001\u0000\u0000\u0000\u0676\u0678\u0003\u00dac\u0000\u0677\u0676\u0001"+ - "\u0000\u0000\u0000\u0678\u0679\u0001\u0000\u0000\u0000\u0679\u0677\u0001"+ - "\u0000\u0000\u0000\u0679\u067a\u0001\u0000\u0000\u0000\u067a\u067c\u0001"+ - "\u0000\u0000\u0000\u067b\u066b\u0001\u0000\u0000\u0000\u067b\u0674\u0001"+ - "\u0000\u0000\u0000\u067c\u0141\u0001\u0000\u0000\u0000\u067d\u067f\u0003"+ - "\u00d4`\u0000\u067e\u0680\u0003\u00d6a\u0000\u067f\u067e\u0001\u0000\u0000"+ - "\u0000\u0680\u0681\u0001\u0000\u0000\u0000\u0681\u067f\u0001\u0000\u0000"+ - "\u0000\u0681\u0682\u0001\u0000\u0000\u0000\u0682\u0683\u0001\u0000\u0000"+ - "\u0000\u0683\u0684\u0003\u00d4`\u0000\u0684\u0143\u0001\u0000\u0000\u0000"+ - "\u0685\u0686\u0003\u0142\u0097\u0000\u0686\u0145\u0001\u0000\u0000\u0000"+ - "\u0687\u0688\u0003\u0014\u0000\u0000\u0688\u0689\u0001\u0000\u0000\u0000"+ - "\u0689\u068a\u0006\u0099\u0000\u0000\u068a\u0147\u0001\u0000\u0000\u0000"+ - "\u068b\u068c\u0003\u0016\u0001\u0000\u068c\u068d\u0001\u0000\u0000\u0000"+ - "\u068d\u068e\u0006\u009a\u0000\u0000\u068e\u0149\u0001\u0000\u0000\u0000"+ - "\u068f\u0690\u0003\u0018\u0002\u0000\u0690\u0691\u0001\u0000\u0000\u0000"+ - "\u0691\u0692\u0006\u009b\u0000\u0000\u0692\u014b\u0001\u0000\u0000\u0000"+ - "\u0693\u0694\u0003\u00c6Y\u0000\u0694\u0695\u0001\u0000\u0000\u0000\u0695"+ - "\u0696\u0006\u009c\u0012\u0000\u0696\u0697\u0006\u009c\u0013\u0000\u0697"+ - "\u014d\u0001\u0000\u0000\u0000\u0698\u0699\u0003\u00ecl\u0000\u0699\u069a"+ - "\u0001\u0000\u0000\u0000\u069a\u069b\u0006\u009d*\u0000\u069b\u014f\u0001"+ - "\u0000\u0000\u0000\u069c\u069d\u0003\u00eak\u0000\u069d\u069e\u0001\u0000"+ - "\u0000\u0000\u069e\u069f\u0006\u009e+\u0000\u069f\u0151\u0001\u0000\u0000"+ - "\u0000\u06a0\u06a1\u0003\u00f0n\u0000\u06a1\u06a2\u0001\u0000\u0000\u0000"+ - "\u06a2\u06a3\u0006\u009f\u0018\u0000\u06a3\u0153\u0001\u0000\u0000\u0000"+ - "\u06a4\u06a5\u0003\u00e6i\u0000\u06a5\u06a6\u0001\u0000\u0000\u0000\u06a6"+ - "\u06a7\u0006\u00a0!\u0000\u06a7\u0155\u0001\u0000\u0000\u0000\u06a8\u06a9"+ - "\u0007\u000f\u0000\u0000\u06a9\u06aa\u0007\u0007\u0000\u0000\u06aa\u06ab"+ - "\u0007\u000b\u0000\u0000\u06ab\u06ac\u0007\u0004\u0000\u0000\u06ac\u06ad"+ - "\u0007\u0010\u0000\u0000\u06ad\u06ae\u0007\u0004\u0000\u0000\u06ae\u06af"+ - "\u0007\u000b\u0000\u0000\u06af\u06b0\u0007\u0004\u0000\u0000\u06b0\u0157"+ - "\u0001\u0000\u0000\u0000\u06b1\u06b2\u0003\u0112\u007f\u0000\u06b2\u06b3"+ - "\u0001\u0000\u0000\u0000\u06b3\u06b4\u0006\u00a2\u001e\u0000\u06b4\u06b5"+ - "\u0006\u00a2\u0013\u0000\u06b5\u06b6\u0006\u00a2\u0004\u0000\u06b6\u0159"+ - "\u0001\u0000\u0000\u0000\u06b7\u06b8\u0003\u010c|\u0000\u06b8\u06b9\u0001"+ - "\u0000\u0000\u0000\u06b9\u06ba\u0006\u00a3#\u0000\u06ba\u015b\u0001\u0000"+ - "\u0000\u0000\u06bb\u06bc\u0003\u0134\u0090\u0000\u06bc\u06bd\u0001\u0000"+ - "\u0000\u0000\u06bd\u06be\u0006\u00a4$\u0000\u06be\u015d\u0001\u0000\u0000"+ - "\u0000\u06bf\u06c0\u0003\u013e\u0095\u0000\u06c0\u06c1\u0001\u0000\u0000"+ - "\u0000\u06c1\u06c2\u0006\u00a5\u0014\u0000\u06c2\u06c3\u0006\u00a5\u0013"+ - "\u0000\u06c3\u06c4\u0006\u00a5\u0013\u0000\u06c4\u015f\u0001\u0000\u0000"+ - "\u0000\u06c5\u06c6\u0003\u013c\u0094\u0000\u06c6\u06c7\u0001\u0000\u0000"+ - "\u0000\u06c7\u06c8\u0006\u00a6\'\u0000\u06c8\u06c9\u0006\u00a6(\u0000"+ - "\u06c9\u0161\u0001\u0000\u0000\u0000\u06ca\u06ce\b\"\u0000\u0000\u06cb"+ - "\u06cc\u0005/\u0000\u0000\u06cc\u06ce\b#\u0000\u0000\u06cd\u06ca\u0001"+ - "\u0000\u0000\u0000\u06cd\u06cb\u0001\u0000\u0000\u0000\u06ce\u0163\u0001"+ - "\u0000\u0000\u0000\u06cf\u06d1\u0003\u0162\u00a7\u0000\u06d0\u06cf\u0001"+ - "\u0000\u0000\u0000\u06d1\u06d2\u0001\u0000\u0000\u0000\u06d2\u06d0\u0001"+ - "\u0000\u0000\u0000\u06d2\u06d3\u0001\u0000\u0000\u0000\u06d3\u0165\u0001"+ - "\u0000\u0000\u0000\u06d4\u06d5\u0003\u0164\u00a8\u0000\u06d5\u06d6\u0001"+ - "\u0000\u0000\u0000\u06d6\u06d7\u0006\u00a9,\u0000\u06d7\u0167\u0001\u0000"+ - "\u0000\u0000\u06d8\u06d9\u0003\u00dcd\u0000\u06d9\u06da\u0001\u0000\u0000"+ - "\u0000\u06da\u06db\u0006\u00aa \u0000\u06db\u0169\u0001\u0000\u0000\u0000"+ - "\u06dc\u06dd\u0003\u0014\u0000\u0000\u06dd\u06de\u0001\u0000\u0000\u0000"+ - "\u06de\u06df\u0006\u00ab\u0000\u0000\u06df\u016b\u0001\u0000\u0000\u0000"+ - "\u06e0\u06e1\u0003\u0016\u0001\u0000\u06e1\u06e2\u0001\u0000\u0000\u0000"+ - "\u06e2\u06e3\u0006\u00ac\u0000\u0000\u06e3\u016d\u0001\u0000\u0000\u0000"+ - "\u06e4\u06e5\u0003\u0018\u0002\u0000\u06e5\u06e6\u0001\u0000\u0000\u0000"+ - "\u06e6\u06e7\u0006\u00ad\u0000\u0000\u06e7\u016f\u0001\u0000\u0000\u0000"+ - "\u06e8\u06e9\u0003\u013c\u0094\u0000\u06e9\u06ea\u0001\u0000\u0000\u0000"+ - "\u06ea\u06eb\u0006\u00ae\'\u0000\u06eb\u06ec\u0006\u00ae(\u0000\u06ec"+ - "\u0171\u0001\u0000\u0000\u0000\u06ed\u06ee\u0003\u013e\u0095\u0000\u06ee"+ - "\u06ef\u0001\u0000\u0000\u0000\u06ef\u06f0\u0006\u00af\u0014\u0000\u06f0"+ - "\u06f1\u0006\u00af\u0013\u0000\u06f1\u06f2\u0006\u00af\u0013\u0000\u06f2"+ - "\u0173\u0001\u0000\u0000\u0000\u06f3\u06f4\u0003\u00c6Y\u0000\u06f4\u06f5"+ - "\u0001\u0000\u0000\u0000\u06f5\u06f6\u0006\u00b0\u0012\u0000\u06f6\u06f7"+ - "\u0006\u00b0\u0013\u0000\u06f7\u0175\u0001\u0000\u0000\u0000\u06f8\u06f9"+ - "\u0003\u0018\u0002\u0000\u06f9\u06fa\u0001\u0000\u0000\u0000\u06fa\u06fb"+ - "\u0006\u00b1\u0000\u0000\u06fb\u0177\u0001\u0000\u0000\u0000\u06fc\u06fd"+ - "\u0003\u0014\u0000\u0000\u06fd\u06fe\u0001\u0000\u0000\u0000\u06fe\u06ff"+ - "\u0006\u00b2\u0000\u0000\u06ff\u0179\u0001\u0000\u0000\u0000\u0700\u0701"+ - "\u0003\u0016\u0001\u0000\u0701\u0702\u0001\u0000\u0000\u0000\u0702\u0703"+ - "\u0006\u00b3\u0000\u0000\u0703\u017b\u0001\u0000\u0000\u0000\u0704\u0705"+ - "\u0003\u00c6Y\u0000\u0705\u0706\u0001\u0000\u0000\u0000\u0706\u0707\u0006"+ - "\u00b4\u0012\u0000\u0707\u0708\u0006\u00b4\u0013\u0000\u0708\u017d\u0001"+ - "\u0000\u0000\u0000\u0709\u070a\u0003\u013e\u0095\u0000\u070a\u070b\u0001"+ - "\u0000\u0000\u0000\u070b\u070c\u0006\u00b5\u0014\u0000\u070c\u070d\u0006"+ - "\u00b5\u0013\u0000\u070d\u070e\u0006\u00b5\u0013\u0000\u070e\u017f\u0001"+ - "\u0000\u0000\u0000\u070f\u0710\u0007\u0006\u0000\u0000\u0710\u0711\u0007"+ - "\f\u0000\u0000\u0711\u0712\u0007\t\u0000\u0000\u0712\u0713\u0007\u0015"+ - "\u0000\u0000\u0713\u0714\u0007\b\u0000\u0000\u0714\u0181\u0001\u0000\u0000"+ - "\u0000\u0715\u0716\u0007\u0011\u0000\u0000\u0716\u0717\u0007\u0002\u0000"+ - "\u0000\u0717\u0718\u0007\t\u0000\u0000\u0718\u0719\u0007\f\u0000\u0000"+ - "\u0719\u071a\u0007\u0007\u0000\u0000\u071a\u0183\u0001\u0000\u0000\u0000"+ - "\u071b\u071c\u0007\u0013\u0000\u0000\u071c\u071d\u0007\u0007\u0000\u0000"+ - "\u071d\u071e\u0007!\u0000\u0000\u071e\u0185\u0001\u0000\u0000\u0000\u071f"+ - "\u0720\u0003\u0112\u007f\u0000\u0720\u0721\u0001\u0000\u0000\u0000\u0721"+ - "\u0722\u0006\u00b9\u001e\u0000\u0722\u0723\u0006\u00b9\u0013\u0000\u0723"+ - "\u0724\u0006\u00b9\u0004\u0000\u0724\u0187\u0001\u0000\u0000\u0000\u0725"+ - "\u0726\u0003\u00f0n\u0000\u0726\u0727\u0001\u0000\u0000\u0000\u0727\u0728"+ - "\u0006\u00ba\u0018\u0000\u0728\u0189\u0001\u0000\u0000\u0000\u0729\u072a"+ - "\u0003\u00f4p\u0000\u072a\u072b\u0001\u0000\u0000\u0000\u072b\u072c\u0006"+ - "\u00bb\u0017\u0000\u072c\u018b\u0001\u0000\u0000\u0000\u072d\u072e\u0003"+ - "\u010c|\u0000\u072e\u072f\u0001\u0000\u0000\u0000\u072f\u0730\u0006\u00bc"+ - "#\u0000\u0730\u018d\u0001\u0000\u0000\u0000\u0731\u0732\u0003\u0134\u0090"+ - "\u0000\u0732\u0733\u0001\u0000\u0000\u0000\u0733\u0734\u0006\u00bd$\u0000"+ - "\u0734\u018f\u0001\u0000\u0000\u0000\u0735\u0736\u0003\u0130\u008e\u0000"+ - "\u0736\u0737\u0001\u0000\u0000\u0000\u0737\u0738\u0006\u00be%\u0000\u0738"+ - "\u0191\u0001\u0000\u0000\u0000\u0739\u073a\u0003\u0136\u0091\u0000\u073a"+ - "\u073b\u0001\u0000\u0000\u0000\u073b\u073c\u0006\u00bf&\u0000\u073c\u0193"+ - "\u0001\u0000\u0000\u0000\u073d\u073e\u0003\u00e8j\u0000\u073e\u073f\u0001"+ - "\u0000\u0000\u0000\u073f\u0740\u0006\u00c0-\u0000\u0740\u0195\u0001\u0000"+ - "\u0000\u0000\u0741\u0742\u0003\u0144\u0098\u0000\u0742\u0743\u0001\u0000"+ - "\u0000\u0000\u0743\u0744\u0006\u00c1\u001b\u0000\u0744\u0197\u0001\u0000"+ - "\u0000\u0000\u0745\u0746\u0003\u0140\u0096\u0000\u0746\u0747\u0001\u0000"+ - "\u0000\u0000\u0747\u0748\u0006\u00c2\u001c\u0000\u0748\u0199\u0001\u0000"+ - "\u0000\u0000\u0749\u074a\u0003\u0014\u0000\u0000\u074a\u074b\u0001\u0000"+ - "\u0000\u0000\u074b\u074c\u0006\u00c3\u0000\u0000\u074c\u019b\u0001\u0000"+ - "\u0000\u0000\u074d\u074e\u0003\u0016\u0001\u0000\u074e\u074f\u0001\u0000"+ - "\u0000\u0000\u074f\u0750\u0006\u00c4\u0000\u0000\u0750\u019d\u0001\u0000"+ - "\u0000\u0000\u0751\u0752\u0003\u0018\u0002\u0000\u0752\u0753\u0001\u0000"+ - "\u0000\u0000\u0753\u0754\u0006\u00c5\u0000\u0000\u0754\u019f\u0001\u0000"+ - "\u0000\u0000\u0755\u0756\u0007\u0011\u0000\u0000\u0756\u0757\u0007\u000b"+ - "\u0000\u0000\u0757\u0758\u0007\u0004\u0000\u0000\u0758\u0759\u0007\u000b"+ - "\u0000\u0000\u0759\u075a\u0007\u0011\u0000\u0000\u075a\u075b\u0001\u0000"+ - "\u0000\u0000\u075b\u075c\u0006\u00c6\u0013\u0000\u075c\u075d\u0006\u00c6"+ - "\u0004\u0000\u075d\u01a1\u0001\u0000\u0000\u0000\u075e\u075f\u0003\u0014"+ - "\u0000\u0000\u075f\u0760\u0001\u0000\u0000\u0000\u0760\u0761\u0006\u00c7"+ - "\u0000\u0000\u0761\u01a3\u0001\u0000\u0000\u0000\u0762\u0763\u0003\u0016"+ - "\u0001\u0000\u0763\u0764\u0001\u0000\u0000\u0000\u0764\u0765\u0006\u00c8"+ - "\u0000\u0000\u0765\u01a5\u0001\u0000\u0000\u0000\u0766\u0767\u0003\u0018"+ - "\u0002\u0000\u0767\u0768\u0001\u0000\u0000\u0000\u0768\u0769\u0006\u00c9"+ - "\u0000\u0000\u0769\u01a7\u0001\u0000\u0000\u0000\u076a\u076b\u0003\u00c6"+ - "Y\u0000\u076b\u076c\u0001\u0000\u0000\u0000\u076c\u076d\u0006\u00ca\u0012"+ - "\u0000\u076d\u076e\u0006\u00ca\u0013\u0000\u076e\u01a9\u0001\u0000\u0000"+ - "\u0000\u076f\u0770\u0007$\u0000\u0000\u0770\u0771\u0007\t\u0000\u0000"+ - "\u0771\u0772\u0007\n\u0000\u0000\u0772\u0773\u0007\u0005\u0000\u0000\u0773"+ - "\u01ab\u0001\u0000\u0000\u0000\u0774\u0775\u0003\u0282\u0137\u0000\u0775"+ - "\u0776\u0001\u0000\u0000\u0000\u0776\u0777\u0006\u00cc\u0016\u0000\u0777"+ - "\u01ad\u0001\u0000\u0000\u0000\u0778\u0779\u0003\u0108z\u0000\u0779\u077a"+ - "\u0001\u0000\u0000\u0000\u077a\u077b\u0006\u00cd\u0015\u0000\u077b\u077c"+ - "\u0006\u00cd\u0013\u0000\u077c\u077d\u0006\u00cd\u0004\u0000\u077d\u01af"+ - "\u0001\u0000\u0000\u0000\u077e\u077f\u0007\u0015\u0000\u0000\u077f\u0780"+ - "\u0007\u0011\u0000\u0000\u0780\u0781\u0007\n\u0000\u0000\u0781\u0782\u0007"+ - "\u0005\u0000\u0000\u0782\u0783\u0007\u0006\u0000\u0000\u0783\u0784\u0001"+ - "\u0000\u0000\u0000\u0784\u0785\u0006\u00ce\u0013\u0000\u0785\u0786\u0006"+ - "\u00ce\u0004\u0000\u0786\u01b1\u0001\u0000\u0000\u0000\u0787\u0788\u0003"+ - "\u0164\u00a8\u0000\u0788\u0789\u0001\u0000\u0000\u0000\u0789\u078a\u0006"+ - "\u00cf,\u0000\u078a\u01b3\u0001\u0000\u0000\u0000\u078b\u078c\u0003\u00dc"+ - "d\u0000\u078c\u078d\u0001\u0000\u0000\u0000\u078d\u078e\u0006\u00d0 \u0000"+ - "\u078e\u01b5\u0001\u0000\u0000\u0000\u078f\u0790\u0003\u00ecl\u0000\u0790"+ - "\u0791\u0001\u0000\u0000\u0000\u0791\u0792\u0006\u00d1*\u0000\u0792\u01b7"+ - "\u0001\u0000\u0000\u0000\u0793\u0794\u0003\u0014\u0000\u0000\u0794\u0795"+ - "\u0001\u0000\u0000\u0000\u0795\u0796\u0006\u00d2\u0000\u0000\u0796\u01b9"+ - "\u0001\u0000\u0000\u0000\u0797\u0798\u0003\u0016\u0001\u0000\u0798\u0799"+ - "\u0001\u0000\u0000\u0000\u0799\u079a\u0006\u00d3\u0000\u0000\u079a\u01bb"+ - "\u0001\u0000\u0000\u0000\u079b\u079c\u0003\u0018\u0002\u0000\u079c\u079d"+ - "\u0001\u0000\u0000\u0000\u079d\u079e\u0006\u00d4\u0000\u0000\u079e\u01bd"+ - "\u0001\u0000\u0000\u0000\u079f\u07a0\u0003\u00c6Y\u0000\u07a0\u07a1\u0001"+ - "\u0000\u0000\u0000\u07a1\u07a2\u0006\u00d5\u0012\u0000\u07a2\u07a3\u0006"+ - "\u00d5\u0013\u0000\u07a3\u01bf\u0001\u0000\u0000\u0000\u07a4\u07a5\u0003"+ - "\u013e\u0095\u0000\u07a5\u07a6\u0001\u0000\u0000\u0000\u07a6\u07a7\u0006"+ - "\u00d6\u0014\u0000\u07a7\u07a8\u0006\u00d6\u0013\u0000\u07a8\u07a9\u0006"+ - "\u00d6\u0013\u0000\u07a9\u01c1\u0001\u0000\u0000\u0000\u07aa\u07ab\u0003"+ - "\u00ecl\u0000\u07ab\u07ac\u0001\u0000\u0000\u0000\u07ac\u07ad\u0006\u00d7"+ - "*\u0000\u07ad\u01c3\u0001\u0000\u0000\u0000\u07ae\u07af\u0003\u00f0n\u0000"+ - "\u07af\u07b0\u0001\u0000\u0000\u0000\u07b0\u07b1\u0006\u00d8\u0018\u0000"+ - "\u07b1\u01c5\u0001\u0000\u0000\u0000\u07b2\u07b3\u0003\u00f4p\u0000\u07b3"+ - "\u07b4\u0001\u0000\u0000\u0000\u07b4\u07b5\u0006\u00d9\u0017\u0000\u07b5"+ - "\u01c7\u0001\u0000\u0000\u0000\u07b6\u07b7\u0003\u0108z\u0000\u07b7\u07b8"+ - "\u0001\u0000\u0000\u0000\u07b8\u07b9\u0006\u00da\u0015\u0000\u07b9\u07ba"+ - "\u0006\u00da.\u0000\u07ba\u01c9\u0001\u0000\u0000\u0000\u07bb\u07bc\u0003"+ - "\u0164\u00a8\u0000\u07bc\u07bd\u0001\u0000\u0000\u0000\u07bd\u07be\u0006"+ - "\u00db,\u0000\u07be\u01cb\u0001\u0000\u0000\u0000\u07bf\u07c0\u0003\u00dc"+ - "d\u0000\u07c0\u07c1\u0001\u0000\u0000\u0000\u07c1\u07c2\u0006\u00dc \u0000"+ - "\u07c2\u01cd\u0001\u0000\u0000\u0000\u07c3\u07c4\u0003\u0014\u0000\u0000"+ - "\u07c4\u07c5\u0001\u0000\u0000\u0000\u07c5\u07c6\u0006\u00dd\u0000\u0000"+ - "\u07c6\u01cf\u0001\u0000\u0000\u0000\u07c7\u07c8\u0003\u0016\u0001\u0000"+ - "\u07c8\u07c9\u0001\u0000\u0000\u0000\u07c9\u07ca\u0006\u00de\u0000\u0000"+ - "\u07ca\u01d1\u0001\u0000\u0000\u0000\u07cb\u07cc\u0003\u0018\u0002\u0000"+ - "\u07cc\u07cd\u0001\u0000\u0000\u0000\u07cd\u07ce\u0006\u00df\u0000\u0000"+ - "\u07ce\u01d3\u0001\u0000\u0000\u0000\u07cf\u07d0\u0003\u00c6Y\u0000\u07d0"+ - "\u07d1\u0001\u0000\u0000\u0000\u07d1\u07d2\u0006\u00e0\u0012\u0000\u07d2"+ - "\u07d3\u0006\u00e0\u0013\u0000\u07d3\u07d4\u0006\u00e0\u0013\u0000\u07d4"+ - "\u01d5\u0001\u0000\u0000\u0000\u07d5\u07d6\u0003\u013e\u0095\u0000\u07d6"+ - "\u07d7\u0001\u0000\u0000\u0000\u07d7\u07d8\u0006\u00e1\u0014\u0000\u07d8"+ - "\u07d9\u0006\u00e1\u0013\u0000\u07d9\u07da\u0006\u00e1\u0013\u0000\u07da"+ - "\u07db\u0006\u00e1\u0013\u0000\u07db\u01d7\u0001\u0000\u0000\u0000\u07dc"+ - "\u07dd\u0003\u00f0n\u0000\u07dd\u07de\u0001\u0000\u0000\u0000\u07de\u07df"+ - "\u0006\u00e2\u0018\u0000\u07df\u01d9\u0001\u0000\u0000\u0000\u07e0\u07e1"+ - "\u0003\u00f4p\u0000\u07e1\u07e2\u0001\u0000\u0000\u0000\u07e2\u07e3\u0006"+ - "\u00e3\u0017\u0000\u07e3\u01db\u0001\u0000\u0000\u0000\u07e4\u07e5\u0003"+ - "\u023e\u0115\u0000\u07e5\u07e6\u0001\u0000\u0000\u0000\u07e6\u07e7\u0006"+ - "\u00e4\"\u0000\u07e7\u01dd\u0001\u0000\u0000\u0000\u07e8\u07e9\u0003\u0014"+ - "\u0000\u0000\u07e9\u07ea\u0001\u0000\u0000\u0000\u07ea\u07eb\u0006\u00e5"+ - "\u0000\u0000\u07eb\u01df\u0001\u0000\u0000\u0000\u07ec\u07ed\u0003\u0016"+ - "\u0001\u0000\u07ed\u07ee\u0001\u0000\u0000\u0000\u07ee\u07ef\u0006\u00e6"+ - "\u0000\u0000\u07ef\u01e1\u0001\u0000\u0000\u0000\u07f0\u07f1\u0003\u0018"+ - "\u0002\u0000\u07f1\u07f2\u0001\u0000\u0000\u0000\u07f2\u07f3\u0006\u00e7"+ - "\u0000\u0000\u07f3\u01e3\u0001\u0000\u0000\u0000\u07f4\u07f5\u0003(\n"+ - "\u0000\u07f5\u07f6\u0001\u0000\u0000\u0000\u07f6\u07f7\u0006\u00e8\u0013"+ - "\u0000\u07f7\u07f8\u0006\u00e8\u0004\u0000\u07f8\u01e5\u0001\u0000\u0000"+ - "\u0000\u07f9\u07fa\u0003\u0108z\u0000\u07fa\u07fb\u0001\u0000\u0000\u0000"+ - "\u07fb\u07fc\u0006\u00e9\u0015\u0000\u07fc\u01e7\u0001\u0000\u0000\u0000"+ - "\u07fd\u07fe\u0003\u0140\u0096\u0000\u07fe\u07ff\u0001\u0000\u0000\u0000"+ - "\u07ff\u0800\u0006\u00ea\u001c\u0000\u0800\u01e9\u0001\u0000\u0000\u0000"+ - "\u0801\u0802\u0003\u0138\u0092\u0000\u0802\u0803\u0001\u0000\u0000\u0000"+ - "\u0803\u0804\u0006\u00eb\u0019\u0000\u0804\u01eb\u0001\u0000\u0000\u0000"+ - "\u0805\u0806\u0003\u013a\u0093\u0000\u0806\u0807\u0001\u0000\u0000\u0000"+ - "\u0807\u0808\u0006\u00ec\u001a\u0000\u0808\u01ed\u0001\u0000\u0000\u0000"+ - "\u0809\u080a\u0003\u00f0n\u0000\u080a\u080b\u0001\u0000\u0000\u0000\u080b"+ - "\u080c\u0006\u00ed\u0018\u0000\u080c\u01ef\u0001\u0000\u0000\u0000\u080d"+ - "\u080e\u0003\u0122\u0087\u0000\u080e\u080f\u0001\u0000\u0000\u0000\u080f"+ - "\u0810\u0006\u00ee/\u0000\u0810\u01f1\u0001\u0000\u0000\u0000\u0811\u0812"+ - "\u0003\u0124\u0088\u0000\u0812\u0813\u0001\u0000\u0000\u0000\u0813\u0814"+ - "\u0006\u00ef0\u0000\u0814\u01f3\u0001\u0000\u0000\u0000\u0815\u0816\u0003"+ - "\u00e0f\u0000\u0816\u0817\u0001\u0000\u0000\u0000\u0817\u0818\u0006\u00f0"+ - "1\u0000\u0818\u01f5\u0001\u0000\u0000\u0000\u0819\u081a\u0003\u00dee\u0000"+ - "\u081a\u081b\u0001\u0000\u0000\u0000\u081b\u081c\u0006\u00f12\u0000\u081c"+ - "\u01f7\u0001\u0000\u0000\u0000\u081d\u081e\u0003\u010c|\u0000\u081e\u081f"+ - "\u0001\u0000\u0000\u0000\u081f\u0820\u0006\u00f2#\u0000\u0820\u01f9\u0001"+ - "\u0000\u0000\u0000\u0821\u0822\u0003\u0134\u0090\u0000\u0822\u0823\u0001"+ - "\u0000\u0000\u0000\u0823\u0824\u0006\u00f3$\u0000\u0824\u01fb\u0001\u0000"+ - "\u0000\u0000\u0825\u0826\u0003\u013c\u0094\u0000\u0826\u0827\u0001\u0000"+ - "\u0000\u0000\u0827\u0828\u0006\u00f4\'\u0000\u0828\u01fd\u0001\u0000\u0000"+ - "\u0000\u0829\u082a\u0003\u013e\u0095\u0000\u082a\u082b\u0001\u0000\u0000"+ - "\u0000\u082b\u082c\u0006\u00f5\u0014\u0000\u082c\u01ff\u0001\u0000\u0000"+ - "\u0000\u082d\u082e\u0003\u00dcd\u0000\u082e\u082f\u0001\u0000\u0000\u0000"+ - "\u082f\u0830\u0006\u00f6 \u0000\u0830\u0201\u0001\u0000\u0000\u0000\u0831"+ - "\u0832\u0003\u00eak\u0000\u0832\u0833\u0001\u0000\u0000\u0000\u0833\u0834"+ - "\u0006\u00f7+\u0000\u0834\u0203\u0001\u0000\u0000\u0000\u0835\u0836\u0003"+ - "\u0014\u0000\u0000\u0836\u0837\u0001\u0000\u0000\u0000\u0837\u0838\u0006"+ - "\u00f8\u0000\u0000\u0838\u0205\u0001\u0000\u0000\u0000\u0839\u083a\u0003"+ - "\u0016\u0001\u0000\u083a\u083b\u0001\u0000\u0000\u0000\u083b\u083c\u0006"+ - "\u00f9\u0000\u0000\u083c\u0207\u0001\u0000\u0000\u0000\u083d\u083e\u0003"+ - "\u0018\u0002\u0000\u083e\u083f\u0001\u0000\u0000\u0000\u083f\u0840\u0006"+ - "\u00fa\u0000\u0000\u0840\u0209\u0001\u0000\u0000\u0000\u0841\u0842\u0003"+ - "\u00c6Y\u0000\u0842\u0843\u0001\u0000\u0000\u0000\u0843\u0844\u0006\u00fb"+ - "\u0012\u0000\u0844\u0845\u0006\u00fb\u0013\u0000\u0845\u020b\u0001\u0000"+ - "\u0000\u0000\u0846\u0847\u0003\u013e\u0095\u0000\u0847\u0848\u0001\u0000"+ - "\u0000\u0000\u0848\u0849\u0006\u00fc\u0014\u0000\u0849\u084a\u0006\u00fc"+ - "\u0013\u0000\u084a\u084b\u0006\u00fc\u0013\u0000\u084b\u020d\u0001\u0000"+ - "\u0000\u0000\u084c\u084d\u0003\u0138\u0092\u0000\u084d\u084e\u0001\u0000"+ - "\u0000\u0000\u084e\u084f\u0006\u00fd\u0019\u0000\u084f\u020f\u0001\u0000"+ - "\u0000\u0000\u0850\u0851\u0003\u013a\u0093\u0000\u0851\u0852\u0001\u0000"+ - "\u0000\u0000\u0852\u0853\u0006\u00fe\u001a\u0000\u0853\u0211\u0001\u0000"+ - "\u0000\u0000\u0854\u0855\u0003\u00f4p\u0000\u0855\u0856\u0001\u0000\u0000"+ - "\u0000\u0856\u0857\u0006\u00ff\u0017\u0000\u0857\u0213\u0001\u0000\u0000"+ - "\u0000\u0858\u0859\u0003\u010c|\u0000\u0859\u085a\u0001\u0000\u0000\u0000"+ - "\u085a\u085b\u0006\u0100#\u0000\u085b\u0215\u0001\u0000\u0000\u0000\u085c"+ - "\u085d\u0003\u0134\u0090\u0000\u085d\u085e\u0001\u0000\u0000\u0000\u085e"+ - "\u085f\u0006\u0101$\u0000\u085f\u0217\u0001\u0000\u0000\u0000\u0860\u0861"+ - "\u0003\u0130\u008e\u0000\u0861\u0862\u0001\u0000\u0000\u0000\u0862\u0863"+ - "\u0006\u0102%\u0000\u0863\u0219\u0001\u0000\u0000\u0000\u0864\u0865\u0003"+ - "\u0136\u0091\u0000\u0865\u0866\u0001\u0000\u0000\u0000\u0866\u0867\u0006"+ - "\u0103&\u0000\u0867\u021b\u0001\u0000\u0000\u0000\u0868\u0869\u0003\u0144"+ - "\u0098\u0000\u0869\u086a\u0001\u0000\u0000\u0000\u086a\u086b\u0006\u0104"+ - "\u001b\u0000\u086b\u021d\u0001\u0000\u0000\u0000\u086c\u086d\u0003\u0140"+ - "\u0096\u0000\u086d\u086e\u0001\u0000\u0000\u0000\u086e\u086f\u0006\u0105"+ - "\u001c\u0000\u086f\u021f\u0001\u0000\u0000\u0000\u0870\u0871\u0003\u0014"+ - "\u0000\u0000\u0871\u0872\u0001\u0000\u0000\u0000\u0872\u0873\u0006\u0106"+ - "\u0000\u0000\u0873\u0221\u0001\u0000\u0000\u0000\u0874\u0875\u0003\u0016"+ - "\u0001\u0000\u0875\u0876\u0001\u0000\u0000\u0000\u0876\u0877\u0006\u0107"+ - "\u0000\u0000\u0877\u0223\u0001\u0000\u0000\u0000\u0878\u0879\u0003\u0018"+ - "\u0002\u0000\u0879\u087a\u0001\u0000\u0000\u0000\u087a\u087b\u0006\u0108"+ - "\u0000\u0000\u087b\u0225\u0001\u0000\u0000\u0000\u087c\u087d\u0003\u00c6"+ - "Y\u0000\u087d\u087e\u0001\u0000\u0000\u0000\u087e\u087f\u0006\u0109\u0012"+ - "\u0000\u087f\u0880\u0006\u0109\u0013\u0000\u0880\u0227\u0001\u0000\u0000"+ - "\u0000\u0881\u0882\u0003\u013e\u0095\u0000\u0882\u0883\u0001\u0000\u0000"+ - "\u0000\u0883\u0884\u0006\u010a\u0014\u0000\u0884\u0885\u0006\u010a\u0013"+ - "\u0000\u0885\u0886\u0006\u010a\u0013\u0000\u0886\u0229\u0001\u0000\u0000"+ - "\u0000\u0887\u0888\u0003\u00f4p\u0000\u0888\u0889\u0001\u0000\u0000\u0000"+ - "\u0889\u088a\u0006\u010b\u0017\u0000\u088a\u022b\u0001\u0000\u0000\u0000"+ - "\u088b\u088c\u0003\u0138\u0092\u0000\u088c\u088d\u0001\u0000\u0000\u0000"+ - "\u088d\u088e\u0006\u010c\u0019\u0000\u088e\u022d\u0001\u0000\u0000\u0000"+ - "\u088f\u0890\u0003\u013a\u0093\u0000\u0890\u0891\u0001\u0000\u0000\u0000"+ - "\u0891\u0892\u0006\u010d\u001a\u0000\u0892\u022f\u0001\u0000\u0000\u0000"+ - "\u0893\u0894\u0003\u00f0n\u0000\u0894\u0895\u0001\u0000\u0000\u0000\u0895"+ - "\u0896\u0006\u010e\u0018\u0000\u0896\u0231\u0001\u0000\u0000\u0000\u0897"+ - "\u0898\u0003\u010c|\u0000\u0898\u0899\u0001\u0000\u0000\u0000\u0899\u089a"+ - "\u0006\u010f#\u0000\u089a\u0233\u0001\u0000\u0000\u0000\u089b\u089c\u0003"+ - "\u0134\u0090\u0000\u089c\u089d\u0001\u0000\u0000\u0000\u089d\u089e\u0006"+ - "\u0110$\u0000\u089e\u0235\u0001\u0000\u0000\u0000\u089f\u08a0\u0003\u0130"+ - "\u008e\u0000\u08a0\u08a1\u0001\u0000\u0000\u0000\u08a1\u08a2\u0006\u0111"+ - "%\u0000\u08a2\u0237\u0001\u0000\u0000\u0000\u08a3\u08a4\u0003\u0136\u0091"+ - "\u0000\u08a4\u08a5\u0001\u0000\u0000\u0000\u08a5\u08a6\u0006\u0112&\u0000"+ - "\u08a6\u0239\u0001\u0000\u0000\u0000\u08a7\u08ac\u0003\u00ca[\u0000\u08a8"+ - "\u08ac\u0003\u00c8Z\u0000\u08a9\u08ac\u0003\u00d8b\u0000\u08aa\u08ac\u0003"+ - "\u0126\u0089\u0000\u08ab\u08a7\u0001\u0000\u0000\u0000\u08ab\u08a8\u0001"+ - "\u0000\u0000\u0000\u08ab\u08a9\u0001\u0000\u0000\u0000\u08ab\u08aa\u0001"+ - "\u0000\u0000\u0000\u08ac\u023b\u0001\u0000\u0000\u0000\u08ad\u08b0\u0003"+ - "\u00ca[\u0000\u08ae\u08b0\u0003\u0126\u0089\u0000\u08af\u08ad\u0001\u0000"+ - "\u0000\u0000\u08af\u08ae\u0001\u0000\u0000\u0000\u08b0\u08b4\u0001\u0000"+ - "\u0000\u0000\u08b1\u08b3\u0003\u023a\u0113\u0000\u08b2\u08b1\u0001\u0000"+ - "\u0000\u0000\u08b3\u08b6\u0001\u0000\u0000\u0000\u08b4\u08b2\u0001\u0000"+ - "\u0000\u0000\u08b4\u08b5\u0001\u0000\u0000\u0000\u08b5\u08c1\u0001\u0000"+ - "\u0000\u0000\u08b6\u08b4\u0001\u0000\u0000\u0000\u08b7\u08ba\u0003\u00d8"+ - "b\u0000\u08b8\u08ba\u0003\u00d2_\u0000\u08b9\u08b7\u0001\u0000\u0000\u0000"+ - "\u08b9\u08b8\u0001\u0000\u0000\u0000\u08ba\u08bc\u0001\u0000\u0000\u0000"+ - "\u08bb\u08bd\u0003\u023a\u0113\u0000\u08bc\u08bb\u0001\u0000\u0000\u0000"+ - "\u08bd\u08be\u0001\u0000\u0000\u0000\u08be\u08bc\u0001\u0000\u0000\u0000"+ - "\u08be\u08bf\u0001\u0000\u0000\u0000\u08bf\u08c1\u0001\u0000\u0000\u0000"+ - "\u08c0\u08af\u0001\u0000\u0000\u0000\u08c0\u08b9\u0001\u0000\u0000\u0000"+ - "\u08c1\u023d\u0001\u0000\u0000\u0000\u08c2\u08c5\u0003\u023c\u0114\u0000"+ - "\u08c3\u08c5\u0003\u0142\u0097\u0000\u08c4\u08c2\u0001\u0000\u0000\u0000"+ - "\u08c4\u08c3\u0001\u0000\u0000\u0000\u08c5\u08c6\u0001\u0000\u0000\u0000"+ - "\u08c6\u08c4\u0001\u0000\u0000\u0000\u08c6\u08c7\u0001\u0000\u0000\u0000"+ - "\u08c7\u023f\u0001\u0000\u0000\u0000\u08c8\u08c9\u0003\u0014\u0000\u0000"+ - "\u08c9\u08ca\u0001\u0000\u0000\u0000\u08ca\u08cb\u0006\u0116\u0000\u0000"+ - "\u08cb\u0241\u0001\u0000\u0000\u0000\u08cc\u08cd\u0003\u0016\u0001\u0000"+ - "\u08cd\u08ce\u0001\u0000\u0000\u0000\u08ce\u08cf\u0006\u0117\u0000\u0000"+ - "\u08cf\u0243\u0001\u0000\u0000\u0000\u08d0\u08d1\u0003\u0018\u0002\u0000"+ - "\u08d1\u08d2\u0001\u0000\u0000\u0000\u08d2\u08d3\u0006\u0118\u0000\u0000"+ - "\u08d3\u0245\u0001\u0000\u0000\u0000\u08d4\u08d5\u0003\u0140\u0096\u0000"+ - "\u08d5\u08d6\u0001\u0000\u0000\u0000\u08d6\u08d7\u0006\u0119\u001c\u0000"+ - "\u08d7\u0247\u0001\u0000\u0000\u0000\u08d8\u08d9\u0003\u0144\u0098\u0000"+ - "\u08d9\u08da\u0001\u0000\u0000\u0000\u08da\u08db\u0006\u011a\u001b\u0000"+ - "\u08db\u0249\u0001\u0000\u0000\u0000\u08dc\u08dd\u0003\u00e6i\u0000\u08dd"+ - "\u08de\u0001\u0000\u0000\u0000\u08de\u08df\u0006\u011b!\u0000\u08df\u024b"+ - "\u0001\u0000\u0000\u0000\u08e0\u08e1\u0003\u0134\u0090\u0000\u08e1\u08e2"+ - "\u0001\u0000\u0000\u0000\u08e2\u08e3\u0006\u011c$\u0000\u08e3\u024d\u0001"+ - "\u0000\u0000\u0000\u08e4\u08e5\u0003\u0164\u00a8\u0000\u08e5\u08e6\u0001"+ - "\u0000\u0000\u0000\u08e6\u08e7\u0006\u011d,\u0000\u08e7\u024f\u0001\u0000"+ - "\u0000\u0000\u08e8\u08e9\u0003\u00dcd\u0000\u08e9\u08ea\u0001\u0000\u0000"+ - "\u0000\u08ea\u08eb\u0006\u011e \u0000\u08eb\u0251\u0001\u0000\u0000\u0000"+ - "\u08ec\u08ed\u0003\u00ecl\u0000\u08ed\u08ee\u0001\u0000\u0000\u0000\u08ee"+ - "\u08ef\u0006\u011f*\u0000\u08ef\u0253\u0001\u0000\u0000\u0000\u08f0\u08f1"+ - "\u0003\u00eak\u0000\u08f1\u08f2\u0001\u0000\u0000\u0000\u08f2\u08f3\u0006"+ - "\u0120+\u0000\u08f3\u0255\u0001\u0000\u0000\u0000\u08f4\u08f5\u0003\u00f0"+ - "n\u0000\u08f5\u08f6\u0001\u0000\u0000\u0000\u08f6\u08f7\u0006\u0121\u0018"+ - "\u0000\u08f7\u0257\u0001\u0000\u0000\u0000\u08f8\u08f9\u0003\u00c6Y\u0000"+ - "\u08f9\u08fa\u0001\u0000\u0000\u0000\u08fa\u08fb\u0006\u0122\u0012\u0000"+ - "\u08fb\u08fc\u0006\u0122\u0013\u0000\u08fc\u0259\u0001\u0000\u0000\u0000"+ - "\u08fd\u08fe\u0003\u013c\u0094\u0000\u08fe\u08ff\u0006\u01233\u0000\u08ff"+ - "\u0900\u0001\u0000\u0000\u0000\u0900\u0901\u0006\u0123\'\u0000\u0901\u025b"+ - "\u0001\u0000\u0000\u0000\u0902\u0903\u0005)\u0000\u0000\u0903\u0904\u0004"+ - "\u0124\u0007\u0000\u0904\u0905\u0006\u01244\u0000\u0905\u0906\u0001\u0000"+ - "\u0000\u0000\u0906\u0907\u0006\u0124\u0014\u0000\u0907\u025d\u0001\u0000"+ - "\u0000\u0000\u0908\u0909\u0005)\u0000\u0000\u0909\u090a\u0004\u0125\b"+ - "\u0000\u090a\u090b\u0006\u01255\u0000\u090b\u090c\u0001\u0000\u0000\u0000"+ - "\u090c\u090d\u0006\u0125\u0014\u0000\u090d\u090e\u0006\u0125\u0013\u0000"+ - "\u090e\u025f\u0001\u0000\u0000\u0000\u090f\u0910\u0003\u0014\u0000\u0000"+ - "\u0910\u0911\u0001\u0000\u0000\u0000\u0911\u0912\u0006\u0126\u0000\u0000"+ - "\u0912\u0261\u0001\u0000\u0000\u0000\u0913\u0914\u0003\u0016\u0001\u0000"+ - "\u0914\u0915\u0001\u0000\u0000\u0000\u0915\u0916\u0006\u0127\u0000\u0000"+ - "\u0916\u0263\u0001\u0000\u0000\u0000\u0917\u0918\u0003\u0018\u0002\u0000"+ - "\u0918\u0919\u0001\u0000\u0000\u0000\u0919\u091a\u0006\u0128\u0000\u0000"+ - "\u091a\u0265\u0001\u0000\u0000\u0000\u091b\u091f\u0005#\u0000\u0000\u091c"+ - "\u091e\b\u0000\u0000\u0000\u091d\u091c\u0001\u0000\u0000\u0000\u091e\u0921"+ - "\u0001\u0000\u0000\u0000\u091f\u091d\u0001\u0000\u0000\u0000\u091f\u0920"+ - "\u0001\u0000\u0000\u0000\u0920\u0923\u0001\u0000\u0000\u0000\u0921\u091f"+ - "\u0001\u0000\u0000\u0000\u0922\u0924\u0005\r\u0000\u0000\u0923\u0922\u0001"+ - "\u0000\u0000\u0000\u0923\u0924\u0001\u0000\u0000\u0000\u0924\u0926\u0001"+ - "\u0000\u0000\u0000\u0925\u0927\u0005\n\u0000\u0000\u0926\u0925\u0001\u0000"+ - "\u0000\u0000\u0926\u0927\u0001\u0000\u0000\u0000\u0927\u0267\u0001\u0000"+ - "\u0000\u0000\u0928\u092e\u0005\'\u0000\u0000\u0929\u092a\u0005\\\u0000"+ - "\u0000\u092a\u092d\t\u0000\u0000\u0000\u092b\u092d\b%\u0000\u0000\u092c"+ - "\u0929\u0001\u0000\u0000\u0000\u092c\u092b\u0001\u0000\u0000\u0000\u092d"+ - "\u0930\u0001\u0000\u0000\u0000\u092e\u092c\u0001\u0000\u0000\u0000\u092e"+ - "\u092f\u0001\u0000\u0000\u0000\u092f\u0931\u0001\u0000\u0000\u0000\u0930"+ - "\u092e\u0001\u0000\u0000\u0000\u0931\u0932\u0005\'\u0000\u0000\u0932\u0269"+ - "\u0001\u0000\u0000\u0000\u0933\u0934\b&\u0000\u0000\u0934\u026b\u0001"+ - "\u0000\u0000\u0000\u0935\u0936\u0003\u00c6Y\u0000\u0936\u0937\u0001\u0000"+ - "\u0000\u0000\u0937\u0938\u0006\u012c\u0012\u0000\u0938\u0939\u0006\u012c"+ - "\u0013\u0000\u0939\u026d\u0001\u0000\u0000\u0000\u093a\u093b\u0003\u013e"+ - "\u0095\u0000\u093b\u093c\u0001\u0000\u0000\u0000\u093c\u093d\u0006\u012d"+ - "\u0014\u0000\u093d\u093e\u0006\u012d\u0013\u0000\u093e\u093f\u0006\u012d"+ - "\u0013\u0000\u093f\u026f\u0001\u0000\u0000\u0000\u0940\u0941\u0003\u0138"+ - "\u0092\u0000\u0941\u0942\u0001\u0000\u0000\u0000\u0942\u0943\u0006\u012e"+ - "\u0019\u0000\u0943\u0271\u0001\u0000\u0000\u0000\u0944\u0945\u0003\u013a"+ - "\u0093\u0000\u0945\u0946\u0001\u0000\u0000\u0000\u0946\u0947\u0006\u012f"+ - "\u001a\u0000\u0947\u0273\u0001\u0000\u0000\u0000\u0948\u0949\u0003\u00e6"+ - "i\u0000\u0949\u094a\u0001\u0000\u0000\u0000\u094a\u094b\u0006\u0130!\u0000"+ - "\u094b\u0275\u0001\u0000\u0000\u0000\u094c\u094d\u0003\u00f0n\u0000\u094d"+ - "\u094e\u0001\u0000\u0000\u0000\u094e\u094f\u0006\u0131\u0018\u0000\u094f"+ - "\u0277\u0001\u0000\u0000\u0000\u0950\u0951\u0003\u00f4p\u0000\u0951\u0952"+ - "\u0001\u0000\u0000\u0000\u0952\u0953\u0006\u0132\u0017\u0000\u0953\u0279"+ - "\u0001\u0000\u0000\u0000\u0954\u0955\u0003\u010c|\u0000\u0955\u0956\u0001"+ - "\u0000\u0000\u0000\u0956\u0957\u0006\u0133#\u0000\u0957\u027b\u0001\u0000"+ - "\u0000\u0000\u0958\u0959\u0003\u0134\u0090\u0000\u0959\u095a\u0001\u0000"+ - "\u0000\u0000\u095a\u095b\u0006\u0134$\u0000\u095b\u027d\u0001\u0000\u0000"+ - "\u0000\u095c\u095d\u0003\u0130\u008e\u0000\u095d\u095e\u0001\u0000\u0000"+ - "\u0000\u095e\u095f\u0006\u0135%\u0000\u095f\u027f\u0001\u0000\u0000\u0000"+ - "\u0960\u0961\u0003\u0136\u0091\u0000\u0961\u0962\u0001\u0000\u0000\u0000"+ - "\u0962\u0963\u0006\u0136&\u0000\u0963\u0281\u0001\u0000\u0000\u0000\u0964"+ - "\u0965\u0007\u0004\u0000\u0000\u0965\u0966\u0007\u0011\u0000\u0000\u0966"+ - "\u0283\u0001\u0000\u0000\u0000\u0967\u0968\u0003\u023e\u0115\u0000\u0968"+ - "\u0969\u0001\u0000\u0000\u0000\u0969\u096a\u0006\u0138\"\u0000\u096a\u0285"+ - "\u0001\u0000\u0000\u0000\u096b\u096c\u0003\u0014\u0000\u0000\u096c\u096d"+ - "\u0001\u0000\u0000\u0000\u096d\u096e\u0006\u0139\u0000\u0000\u096e\u0287"+ - "\u0001\u0000\u0000\u0000\u096f\u0970\u0003\u0016\u0001\u0000\u0970\u0971"+ - "\u0001\u0000\u0000\u0000\u0971\u0972\u0006\u013a\u0000\u0000\u0972\u0289"+ - "\u0001\u0000\u0000\u0000\u0973\u0974\u0003\u0018\u0002\u0000\u0974\u0975"+ - "\u0001\u0000\u0000\u0000\u0975\u0976\u0006\u013b\u0000\u0000\u0976\u028b"+ - "\u0001\u0000\u0000\u0000\u0977\u0978\u0003\u0110~\u0000\u0978\u0979\u0001"+ - "\u0000\u0000\u0000\u0979\u097a\u0006\u013c6\u0000\u097a\u028d\u0001\u0000"+ - "\u0000\u0000\u097b\u097c\u0003\u00f6q\u0000\u097c\u097d\u0001\u0000\u0000"+ - "\u0000\u097d\u097e\u0006\u013d7\u0000\u097e\u028f\u0001\u0000\u0000\u0000"+ - "\u097f\u0980\u0003\u0104x\u0000\u0980\u0981\u0001\u0000\u0000\u0000\u0981"+ - "\u0982\u0006\u013e8\u0000\u0982\u0291\u0001\u0000\u0000\u0000\u0983\u0984"+ - "\u0003\u00eem\u0000\u0984\u0985\u0001\u0000\u0000\u0000\u0985\u0986\u0006"+ - "\u013f9\u0000\u0986\u0987\u0006\u013f\u0013\u0000\u0987\u0293\u0001\u0000"+ - "\u0000\u0000\u0988\u0989\u0003\u00e6i\u0000\u0989\u098a\u0001\u0000\u0000"+ - "\u0000\u098a\u098b\u0006\u0140!\u0000\u098b\u0295\u0001\u0000\u0000\u0000"+ - "\u098c\u098d\u0003\u00dcd\u0000\u098d\u098e\u0001\u0000\u0000\u0000\u098e"+ - "\u098f\u0006\u0141 \u0000\u098f\u0297\u0001\u0000\u0000\u0000\u0990\u0991"+ - "\u0003\u0140\u0096\u0000\u0991\u0992\u0001\u0000\u0000\u0000\u0992\u0993"+ - "\u0006\u0142\u001c\u0000\u0993\u0299\u0001\u0000\u0000\u0000\u0994\u0995"+ - "\u0003\u0144\u0098\u0000\u0995\u0996\u0001\u0000\u0000\u0000\u0996\u0997"+ - "\u0006\u0143\u001b\u0000\u0997\u029b\u0001\u0000\u0000\u0000\u0998\u0999"+ - "\u0003\u00e0f\u0000\u0999\u099a\u0001\u0000\u0000\u0000\u099a\u099b\u0006"+ - "\u01441\u0000\u099b\u029d\u0001\u0000\u0000\u0000\u099c\u099d\u0003\u00de"+ - "e\u0000\u099d\u099e\u0001\u0000\u0000\u0000\u099e\u099f\u0006\u01452\u0000"+ - "\u099f\u029f\u0001\u0000\u0000\u0000\u09a0\u09a1\u0003\u00ecl\u0000\u09a1"+ - "\u09a2\u0001\u0000\u0000\u0000\u09a2\u09a3\u0006\u0146*\u0000\u09a3\u02a1"+ - "\u0001\u0000\u0000\u0000\u09a4\u09a5\u0003\u00f0n\u0000\u09a5\u09a6\u0001"+ - "\u0000\u0000\u0000\u09a6\u09a7\u0006\u0147\u0018\u0000\u09a7\u02a3\u0001"+ - "\u0000\u0000\u0000\u09a8\u09a9\u0003\u00f4p\u0000\u09a9\u09aa\u0001\u0000"+ - "\u0000\u0000\u09aa\u09ab\u0006\u0148\u0017\u0000\u09ab\u02a5\u0001\u0000"+ - "\u0000\u0000\u09ac\u09ad\u0003\u010c|\u0000\u09ad\u09ae\u0001\u0000\u0000"+ - "\u0000\u09ae\u09af\u0006\u0149#\u0000\u09af\u02a7\u0001\u0000\u0000\u0000"+ - "\u09b0\u09b1\u0003\u0134\u0090\u0000\u09b1\u09b2\u0001\u0000\u0000\u0000"+ - "\u09b2\u09b3\u0006\u014a$\u0000\u09b3\u02a9\u0001\u0000\u0000\u0000\u09b4"+ - "\u09b5\u0003\u012c\u008c\u0000\u09b5\u09b6\u0001\u0000\u0000\u0000\u09b6"+ - "\u09b7\u0006\u014b:\u0000\u09b7\u02ab\u0001\u0000\u0000\u0000\u09b8\u09b9"+ - "\u0003\u012e\u008d\u0000\u09b9\u09ba\u0001\u0000\u0000\u0000\u09ba\u09bb"+ - "\u0006\u014c;\u0000\u09bb\u02ad\u0001\u0000\u0000\u0000\u09bc\u09bd\u0003"+ - "\u0130\u008e\u0000\u09bd\u09be\u0001\u0000\u0000\u0000\u09be\u09bf\u0006"+ - "\u014d%\u0000\u09bf\u02af\u0001\u0000\u0000\u0000\u09c0\u09c1\u0003\u0136"+ - "\u0091\u0000\u09c1\u09c2\u0001\u0000\u0000\u0000\u09c2\u09c3\u0006\u014e"+ - "&\u0000\u09c3\u02b1\u0001\u0000\u0000\u0000\u09c4\u09c5\u0003\u0138\u0092"+ - "\u0000\u09c5\u09c6\u0001\u0000\u0000\u0000\u09c6\u09c7\u0006\u014f\u0019"+ - "\u0000\u09c7\u02b3\u0001\u0000\u0000\u0000\u09c8\u09c9\u0003\u013a\u0093"+ - "\u0000\u09c9\u09ca\u0001\u0000\u0000\u0000\u09ca\u09cb\u0006\u0150\u001a"+ - "\u0000\u09cb\u02b5\u0001\u0000\u0000\u0000\u09cc\u09cd\u0003\u023e\u0115"+ - "\u0000\u09cd\u09ce\u0001\u0000\u0000\u0000\u09ce\u09cf\u0006\u0151\"\u0000"+ - "\u09cf\u02b7\u0001\u0000\u0000\u0000\u09d0\u09d1\u0003\u0014\u0000\u0000"+ - "\u09d1\u09d2\u0001\u0000\u0000\u0000\u09d2\u09d3\u0006\u0152\u0000\u0000"+ - "\u09d3\u02b9\u0001\u0000\u0000\u0000\u09d4\u09d5\u0003\u0016\u0001\u0000"+ - "\u09d5\u09d6\u0001\u0000\u0000\u0000\u09d6\u09d7\u0006\u0153\u0000\u0000"+ - "\u09d7\u02bb\u0001\u0000\u0000\u0000\u09d8\u09d9\u0003\u0018\u0002\u0000"+ - "\u09d9\u09da\u0001\u0000\u0000\u0000\u09da\u09db\u0006\u0154\u0000\u0000"+ - "\u09db\u02bd\u0001\u0000\u0000\u0000\u09dc\u09dd\u0003\u00c6Y\u0000\u09dd"+ - "\u09de\u0001\u0000\u0000\u0000\u09de\u09df\u0006\u0155\u0012\u0000\u09df"+ - "\u09e0\u0006\u0155\u0013\u0000\u09e0\u02bf\u0001\u0000\u0000\u0000\u09e1"+ - "\u09e2\u0007\n\u0000\u0000\u09e2\u09e3\u0007\u0005\u0000\u0000\u09e3\u09e4"+ - "\u0007\u0016\u0000\u0000\u09e4\u09e5\u0007\t\u0000\u0000\u09e5\u02c1\u0001"+ - "\u0000\u0000\u0000\u09e6\u09e7\u0003\u0014\u0000\u0000\u09e7\u09e8\u0001"+ - "\u0000\u0000\u0000\u09e8\u09e9\u0006\u0157\u0000\u0000\u09e9\u02c3\u0001"+ - "\u0000\u0000\u0000\u09ea\u09eb\u0003\u0016\u0001\u0000\u09eb\u09ec\u0001"+ - "\u0000\u0000\u0000\u09ec\u09ed\u0006\u0158\u0000\u0000\u09ed\u02c5\u0001"+ - "\u0000\u0000\u0000\u09ee\u09ef\u0003\u0018\u0002\u0000\u09ef\u09f0\u0001"+ - "\u0000\u0000\u0000\u09f0\u09f1\u0006\u0159\u0000\u0000\u09f1\u02c7\u0001"+ - "\u0000\u0000\u0000M\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b"+ - "\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u02ce\u02d2\u02d5\u02de"+ - "\u02e0\u02eb\u0460\u04b5\u04b9\u04be\u0542\u0547\u0550\u0557\u055c\u055e"+ - "\u0569\u0571\u0574\u0576\u057b\u0580\u0586\u058d\u0592\u0598\u059b\u05a3"+ - "\u05a7\u0634\u0639\u0640\u0642\u0647\u064c\u0653\u0655\u066f\u0674\u0679"+ - "\u067b\u0681\u06cd\u06d2\u08ab\u08af\u08b4\u08b9\u08be\u08c0\u08c4\u08c6"+ - "\u091f\u0923\u0926\u092c\u092e<\u0000\u0001\u0000\u0005\u0001\u0000\u0005"+ - "\u0002\u0000\u0005\u0004\u0000\u0005\u0005\u0000\u0005\u0006\u0000\u0005"+ - "\u0007\u0000\u0005\b\u0000\u0005\t\u0000\u0005\n\u0000\u0005\u000b\u0000"+ - "\u0005\r\u0000\u0005\u000e\u0000\u0005\u000f\u0000\u0005\u0010\u0000\u0005"+ - "\u0011\u0000\u0005\u0012\u0000\u0005\u0013\u0000\u00079\u0000\u0004\u0000"+ - "\u0000\u0007j\u0000\u0007P\u0000\u0007\u009e\u0000\u0007F\u0000\u0007"+ - "D\u0000\u0007g\u0000\u0007h\u0000\u0007l\u0000\u0007k\u0000\u0005\u0003"+ - "\u0000\u0007U\u0000\u0007/\u0000\u0007:\u0000\u0007?\u0000"; + "\u02b8\u0000\u02ba\u00a3\u02bc\u00a4\u02be\u00a5\u02c0\u0000\u02c2\u00a6"+ + "\u02c4\u00a7\u02c6\u00a8\u02c8\u00a9\u0014\u0000\u0001\u0002\u0003\u0004"+ + "\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013"+ + "\'\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0002\u0000CCcc\u0002\u0000"+ + "HHhh\u0002\u0000AAaa\u0002\u0000NNnn\u0002\u0000GGgg\u0002\u0000EEee\u0002"+ + "\u0000PPpp\u0002\u0000OOoo\u0002\u0000IIii\u0002\u0000TTtt\u0002\u0000"+ + "RRrr\u0002\u0000XXxx\u0002\u0000LLll\u0002\u0000MMmm\u0002\u0000DDdd\u0002"+ + "\u0000SSss\u0002\u0000VVvv\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000"+ + "UUuu\u0002\u0000FFff\u0002\u0000QQqq\u0006\u0000\t\n\r\r //[[]]\f\u0000"+ + "\t\n\r\r \"#(),,//::<<>?\\\\||\u0001\u000009\u0002\u0000AZaz\b\u0000"+ + "\"\"NNRRTT\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001"+ + "\u0000``\u0002\u0000BBbb\u0002\u0000YYyy\f\u0000\t\n\r\r \"\"(),,//:"+ + ":==[[]]||\u0002\u0000**//\u0002\u0000JJjj\u0002\u0000\'\'\\\\\u0007\u0000"+ + "\n\n\r\r \"#\')``||\u0a1c\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016"+ + "\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a"+ + "\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e"+ + "\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001"+ + "\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000"+ + "\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000"+ + ",\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001"+ + "\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000"+ + "\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000"+ + ":\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001"+ + "\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0000B\u0001\u0000\u0000"+ + "\u0000\u0000D\u0001\u0000\u0000\u0000\u0000F\u0001\u0000\u0000\u0000\u0000"+ + "H\u0001\u0000\u0000\u0000\u0000J\u0001\u0000\u0000\u0000\u0000L\u0001"+ + "\u0000\u0000\u0000\u0000N\u0001\u0000\u0000\u0000\u0000P\u0001\u0000\u0000"+ + "\u0000\u0000R\u0001\u0000\u0000\u0000\u0000T\u0001\u0000\u0000\u0000\u0000"+ + "V\u0001\u0000\u0000\u0000\u0000X\u0001\u0000\u0000\u0000\u0000Z\u0001"+ + "\u0000\u0000\u0000\u0000\\\u0001\u0000\u0000\u0000\u0000^\u0001\u0000"+ + "\u0000\u0000\u0000`\u0001\u0000\u0000\u0000\u0000b\u0001\u0000\u0000\u0000"+ + "\u0000d\u0001\u0000\u0000\u0000\u0000f\u0001\u0000\u0000\u0000\u0000h"+ + "\u0001\u0000\u0000\u0000\u0000j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000"+ + "\u0000\u0000\u0001n\u0001\u0000\u0000\u0000\u0001p\u0001\u0000\u0000\u0000"+ + "\u0001r\u0001\u0000\u0000\u0000\u0001t\u0001\u0000\u0000\u0000\u0001v"+ + "\u0001\u0000\u0000\u0000\u0001x\u0001\u0000\u0000\u0000\u0001z\u0001\u0000"+ + "\u0000\u0000\u0001|\u0001\u0000\u0000\u0000\u0001~\u0001\u0000\u0000\u0000"+ + "\u0001\u0080\u0001\u0000\u0000\u0000\u0001\u0082\u0001\u0000\u0000\u0000"+ + "\u0001\u0084\u0001\u0000\u0000\u0000\u0002\u0086\u0001\u0000\u0000\u0000"+ + "\u0002\u0088\u0001\u0000\u0000\u0000\u0002\u008a\u0001\u0000\u0000\u0000"+ + "\u0002\u008c\u0001\u0000\u0000\u0000\u0002\u0090\u0001\u0000\u0000\u0000"+ + "\u0002\u0092\u0001\u0000\u0000\u0000\u0002\u0094\u0001\u0000\u0000\u0000"+ + "\u0002\u0096\u0001\u0000\u0000\u0000\u0002\u0098\u0001\u0000\u0000\u0000"+ + "\u0002\u009a\u0001\u0000\u0000\u0000\u0003\u009c\u0001\u0000\u0000\u0000"+ + "\u0003\u009e\u0001\u0000\u0000\u0000\u0003\u00a0\u0001\u0000\u0000\u0000"+ + "\u0003\u00a2\u0001\u0000\u0000\u0000\u0003\u00a4\u0001\u0000\u0000\u0000"+ + "\u0003\u00a6\u0001\u0000\u0000\u0000\u0003\u00a8\u0001\u0000\u0000\u0000"+ + "\u0003\u00aa\u0001\u0000\u0000\u0000\u0003\u00ac\u0001\u0000\u0000\u0000"+ + "\u0003\u00ae\u0001\u0000\u0000\u0000\u0003\u00b0\u0001\u0000\u0000\u0000"+ + "\u0003\u00b2\u0001\u0000\u0000\u0000\u0003\u00b4\u0001\u0000\u0000\u0000"+ + "\u0003\u00b6\u0001\u0000\u0000\u0000\u0003\u00b8\u0001\u0000\u0000\u0000"+ + "\u0003\u00ba\u0001\u0000\u0000\u0000\u0003\u00bc\u0001\u0000\u0000\u0000"+ + "\u0004\u00be\u0001\u0000\u0000\u0000\u0004\u00c0\u0001\u0000\u0000\u0000"+ + "\u0004\u00c2\u0001\u0000\u0000\u0000\u0004\u00c4\u0001\u0000\u0000\u0000"+ + "\u0004\u00c6\u0001\u0000\u0000\u0000\u0005\u00c8\u0001\u0000\u0000\u0000"+ + "\u0005\u00de\u0001\u0000\u0000\u0000\u0005\u00e0\u0001\u0000\u0000\u0000"+ + "\u0005\u00e2\u0001\u0000\u0000\u0000\u0005\u00e4\u0001\u0000\u0000\u0000"+ + "\u0005\u00e6\u0001\u0000\u0000\u0000\u0005\u00e8\u0001\u0000\u0000\u0000"+ + "\u0005\u00ea\u0001\u0000\u0000\u0000\u0005\u00ec\u0001\u0000\u0000\u0000"+ + "\u0005\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0\u0001\u0000\u0000\u0000"+ + "\u0005\u00f2\u0001\u0000\u0000\u0000\u0005\u00f4\u0001\u0000\u0000\u0000"+ + "\u0005\u00f6\u0001\u0000\u0000\u0000\u0005\u00f8\u0001\u0000\u0000\u0000"+ + "\u0005\u00fa\u0001\u0000\u0000\u0000\u0005\u00fc\u0001\u0000\u0000\u0000"+ + "\u0005\u00fe\u0001\u0000\u0000\u0000\u0005\u0100\u0001\u0000\u0000\u0000"+ + "\u0005\u0102\u0001\u0000\u0000\u0000\u0005\u0104\u0001\u0000\u0000\u0000"+ + "\u0005\u0106\u0001\u0000\u0000\u0000\u0005\u0108\u0001\u0000\u0000\u0000"+ + "\u0005\u010a\u0001\u0000\u0000\u0000\u0005\u010c\u0001\u0000\u0000\u0000"+ + "\u0005\u010e\u0001\u0000\u0000\u0000\u0005\u0110\u0001\u0000\u0000\u0000"+ + "\u0005\u0112\u0001\u0000\u0000\u0000\u0005\u0114\u0001\u0000\u0000\u0000"+ + "\u0005\u0116\u0001\u0000\u0000\u0000\u0005\u0118\u0001\u0000\u0000\u0000"+ + "\u0005\u011a\u0001\u0000\u0000\u0000\u0005\u011c\u0001\u0000\u0000\u0000"+ + "\u0005\u011e\u0001\u0000\u0000\u0000\u0005\u0120\u0001\u0000\u0000\u0000"+ + "\u0005\u0122\u0001\u0000\u0000\u0000\u0005\u0124\u0001\u0000\u0000\u0000"+ + "\u0005\u0126\u0001\u0000\u0000\u0000\u0005\u0128\u0001\u0000\u0000\u0000"+ + "\u0005\u012a\u0001\u0000\u0000\u0000\u0005\u012c\u0001\u0000\u0000\u0000"+ + "\u0005\u012e\u0001\u0000\u0000\u0000\u0005\u0130\u0001\u0000\u0000\u0000"+ + "\u0005\u0132\u0001\u0000\u0000\u0000\u0005\u0134\u0001\u0000\u0000\u0000"+ + "\u0005\u0136\u0001\u0000\u0000\u0000\u0005\u0138\u0001\u0000\u0000\u0000"+ + "\u0005\u013a\u0001\u0000\u0000\u0000\u0005\u013c\u0001\u0000\u0000\u0000"+ + "\u0005\u013e\u0001\u0000\u0000\u0000\u0005\u0140\u0001\u0000\u0000\u0000"+ + "\u0005\u0142\u0001\u0000\u0000\u0000\u0005\u0146\u0001\u0000\u0000\u0000"+ + "\u0005\u0148\u0001\u0000\u0000\u0000\u0005\u014a\u0001\u0000\u0000\u0000"+ + "\u0005\u014c\u0001\u0000\u0000\u0000\u0006\u014e\u0001\u0000\u0000\u0000"+ + "\u0006\u0150\u0001\u0000\u0000\u0000\u0006\u0152\u0001\u0000\u0000\u0000"+ + "\u0006\u0154\u0001\u0000\u0000\u0000\u0006\u0156\u0001\u0000\u0000\u0000"+ + "\u0006\u0158\u0001\u0000\u0000\u0000\u0006\u015a\u0001\u0000\u0000\u0000"+ + "\u0006\u015c\u0001\u0000\u0000\u0000\u0006\u015e\u0001\u0000\u0000\u0000"+ + "\u0006\u0160\u0001\u0000\u0000\u0000\u0006\u0162\u0001\u0000\u0000\u0000"+ + "\u0006\u0166\u0001\u0000\u0000\u0000\u0006\u0168\u0001\u0000\u0000\u0000"+ + "\u0006\u016a\u0001\u0000\u0000\u0000\u0006\u016c\u0001\u0000\u0000\u0000"+ + "\u0006\u016e\u0001\u0000\u0000\u0000\u0006\u0170\u0001\u0000\u0000\u0000"+ + "\u0007\u0172\u0001\u0000\u0000\u0000\u0007\u0174\u0001\u0000\u0000\u0000"+ + "\u0007\u0176\u0001\u0000\u0000\u0000\u0007\u0178\u0001\u0000\u0000\u0000"+ + "\u0007\u017a\u0001\u0000\u0000\u0000\u0007\u017c\u0001\u0000\u0000\u0000"+ + "\b\u017e\u0001\u0000\u0000\u0000\b\u0180\u0001\u0000\u0000\u0000\b\u0182"+ + "\u0001\u0000\u0000\u0000\b\u0184\u0001\u0000\u0000\u0000\b\u0186\u0001"+ + "\u0000\u0000\u0000\b\u0188\u0001\u0000\u0000\u0000\b\u018a\u0001\u0000"+ + "\u0000\u0000\b\u018c\u0001\u0000\u0000\u0000\b\u018e\u0001\u0000\u0000"+ + "\u0000\b\u0190\u0001\u0000\u0000\u0000\b\u0192\u0001\u0000\u0000\u0000"+ + "\b\u0194\u0001\u0000\u0000\u0000\b\u0196\u0001\u0000\u0000\u0000\b\u0198"+ + "\u0001\u0000\u0000\u0000\b\u019a\u0001\u0000\u0000\u0000\b\u019c\u0001"+ + "\u0000\u0000\u0000\b\u019e\u0001\u0000\u0000\u0000\b\u01a0\u0001\u0000"+ + "\u0000\u0000\t\u01a2\u0001\u0000\u0000\u0000\t\u01a4\u0001\u0000\u0000"+ + "\u0000\t\u01a6\u0001\u0000\u0000\u0000\t\u01a8\u0001\u0000\u0000\u0000"+ + "\n\u01aa\u0001\u0000\u0000\u0000\n\u01ac\u0001\u0000\u0000\u0000\n\u01ae"+ + "\u0001\u0000\u0000\u0000\n\u01b0\u0001\u0000\u0000\u0000\n\u01b2\u0001"+ + "\u0000\u0000\u0000\n\u01b4\u0001\u0000\u0000\u0000\n\u01b6\u0001\u0000"+ + "\u0000\u0000\n\u01b8\u0001\u0000\u0000\u0000\n\u01ba\u0001\u0000\u0000"+ + "\u0000\n\u01bc\u0001\u0000\u0000\u0000\n\u01be\u0001\u0000\u0000\u0000"+ + "\u000b\u01c0\u0001\u0000\u0000\u0000\u000b\u01c2\u0001\u0000\u0000\u0000"+ + "\u000b\u01c4\u0001\u0000\u0000\u0000\u000b\u01c6\u0001\u0000\u0000\u0000"+ + "\u000b\u01c8\u0001\u0000\u0000\u0000\u000b\u01ca\u0001\u0000\u0000\u0000"+ + "\u000b\u01cc\u0001\u0000\u0000\u0000\u000b\u01ce\u0001\u0000\u0000\u0000"+ + "\u000b\u01d0\u0001\u0000\u0000\u0000\u000b\u01d2\u0001\u0000\u0000\u0000"+ + "\u000b\u01d4\u0001\u0000\u0000\u0000\f\u01d6\u0001\u0000\u0000\u0000\f"+ + "\u01d8\u0001\u0000\u0000\u0000\f\u01da\u0001\u0000\u0000\u0000\f\u01dc"+ + "\u0001\u0000\u0000\u0000\f\u01de\u0001\u0000\u0000\u0000\f\u01e0\u0001"+ + "\u0000\u0000\u0000\f\u01e2\u0001\u0000\u0000\u0000\f\u01e4\u0001\u0000"+ + "\u0000\u0000\r\u01e6\u0001\u0000\u0000\u0000\r\u01e8\u0001\u0000\u0000"+ + "\u0000\r\u01ea\u0001\u0000\u0000\u0000\r\u01ec\u0001\u0000\u0000\u0000"+ + "\r\u01ee\u0001\u0000\u0000\u0000\r\u01f0\u0001\u0000\u0000\u0000\r\u01f2"+ + "\u0001\u0000\u0000\u0000\r\u01f4\u0001\u0000\u0000\u0000\r\u01f6\u0001"+ + "\u0000\u0000\u0000\r\u01f8\u0001\u0000\u0000\u0000\r\u01fa\u0001\u0000"+ + "\u0000\u0000\r\u01fc\u0001\u0000\u0000\u0000\r\u01fe\u0001\u0000\u0000"+ + "\u0000\r\u0200\u0001\u0000\u0000\u0000\r\u0202\u0001\u0000\u0000\u0000"+ + "\r\u0204\u0001\u0000\u0000\u0000\r\u0206\u0001\u0000\u0000\u0000\r\u0208"+ + "\u0001\u0000\u0000\u0000\r\u020a\u0001\u0000\u0000\u0000\u000e\u020c\u0001"+ + "\u0000\u0000\u0000\u000e\u020e\u0001\u0000\u0000\u0000\u000e\u0210\u0001"+ + "\u0000\u0000\u0000\u000e\u0212\u0001\u0000\u0000\u0000\u000e\u0214\u0001"+ + "\u0000\u0000\u0000\u000e\u0216\u0001\u0000\u0000\u0000\u000e\u0218\u0001"+ + "\u0000\u0000\u0000\u000e\u021a\u0001\u0000\u0000\u0000\u000e\u021c\u0001"+ + "\u0000\u0000\u0000\u000e\u021e\u0001\u0000\u0000\u0000\u000e\u0220\u0001"+ + "\u0000\u0000\u0000\u000e\u0222\u0001\u0000\u0000\u0000\u000e\u0224\u0001"+ + "\u0000\u0000\u0000\u000e\u0226\u0001\u0000\u0000\u0000\u000f\u0228\u0001"+ + "\u0000\u0000\u0000\u000f\u022a\u0001\u0000\u0000\u0000\u000f\u022c\u0001"+ + "\u0000\u0000\u0000\u000f\u022e\u0001\u0000\u0000\u0000\u000f\u0230\u0001"+ + "\u0000\u0000\u0000\u000f\u0232\u0001\u0000\u0000\u0000\u000f\u0234\u0001"+ + "\u0000\u0000\u0000\u000f\u0236\u0001\u0000\u0000\u0000\u000f\u0238\u0001"+ + "\u0000\u0000\u0000\u000f\u023a\u0001\u0000\u0000\u0000\u000f\u0240\u0001"+ + "\u0000\u0000\u0000\u000f\u0242\u0001\u0000\u0000\u0000\u000f\u0244\u0001"+ + "\u0000\u0000\u0000\u000f\u0246\u0001\u0000\u0000\u0000\u0010\u0248\u0001"+ + "\u0000\u0000\u0000\u0010\u024a\u0001\u0000\u0000\u0000\u0010\u024c\u0001"+ + "\u0000\u0000\u0000\u0010\u024e\u0001\u0000\u0000\u0000\u0010\u0250\u0001"+ + "\u0000\u0000\u0000\u0010\u0252\u0001\u0000\u0000\u0000\u0010\u0254\u0001"+ + "\u0000\u0000\u0000\u0010\u0256\u0001\u0000\u0000\u0000\u0010\u0258\u0001"+ + "\u0000\u0000\u0000\u0010\u025a\u0001\u0000\u0000\u0000\u0010\u025c\u0001"+ + "\u0000\u0000\u0000\u0010\u025e\u0001\u0000\u0000\u0000\u0010\u0260\u0001"+ + "\u0000\u0000\u0000\u0010\u0262\u0001\u0000\u0000\u0000\u0010\u0264\u0001"+ + "\u0000\u0000\u0000\u0010\u0266\u0001\u0000\u0000\u0000\u0010\u0268\u0001"+ + "\u0000\u0000\u0000\u0010\u026a\u0001\u0000\u0000\u0000\u0010\u026c\u0001"+ + "\u0000\u0000\u0000\u0011\u026e\u0001\u0000\u0000\u0000\u0011\u0270\u0001"+ + "\u0000\u0000\u0000\u0011\u0272\u0001\u0000\u0000\u0000\u0011\u0274\u0001"+ + "\u0000\u0000\u0000\u0011\u0276\u0001\u0000\u0000\u0000\u0011\u0278\u0001"+ + "\u0000\u0000\u0000\u0011\u027a\u0001\u0000\u0000\u0000\u0011\u027c\u0001"+ + "\u0000\u0000\u0000\u0011\u027e\u0001\u0000\u0000\u0000\u0011\u0280\u0001"+ + "\u0000\u0000\u0000\u0011\u0282\u0001\u0000\u0000\u0000\u0011\u0284\u0001"+ + "\u0000\u0000\u0000\u0011\u0286\u0001\u0000\u0000\u0000\u0011\u0288\u0001"+ + "\u0000\u0000\u0000\u0011\u028a\u0001\u0000\u0000\u0000\u0011\u028c\u0001"+ + "\u0000\u0000\u0000\u0012\u028e\u0001\u0000\u0000\u0000\u0012\u0290\u0001"+ + "\u0000\u0000\u0000\u0012\u0292\u0001\u0000\u0000\u0000\u0012\u0294\u0001"+ + "\u0000\u0000\u0000\u0012\u0296\u0001\u0000\u0000\u0000\u0012\u0298\u0001"+ + "\u0000\u0000\u0000\u0012\u029a\u0001\u0000\u0000\u0000\u0012\u029c\u0001"+ + "\u0000\u0000\u0000\u0012\u029e\u0001\u0000\u0000\u0000\u0012\u02a0\u0001"+ + "\u0000\u0000\u0000\u0012\u02a2\u0001\u0000\u0000\u0000\u0012\u02a4\u0001"+ + "\u0000\u0000\u0000\u0012\u02a6\u0001\u0000\u0000\u0000\u0012\u02a8\u0001"+ + "\u0000\u0000\u0000\u0012\u02aa\u0001\u0000\u0000\u0000\u0012\u02ac\u0001"+ + "\u0000\u0000\u0000\u0012\u02ae\u0001\u0000\u0000\u0000\u0012\u02b0\u0001"+ + "\u0000\u0000\u0000\u0012\u02b2\u0001\u0000\u0000\u0000\u0012\u02b4\u0001"+ + "\u0000\u0000\u0000\u0012\u02b6\u0001\u0000\u0000\u0000\u0012\u02b8\u0001"+ + "\u0000\u0000\u0000\u0012\u02ba\u0001\u0000\u0000\u0000\u0012\u02bc\u0001"+ + "\u0000\u0000\u0000\u0012\u02be\u0001\u0000\u0000\u0000\u0013\u02c0\u0001"+ + "\u0000\u0000\u0000\u0013\u02c2\u0001\u0000\u0000\u0000\u0013\u02c4\u0001"+ + "\u0000\u0000\u0000\u0013\u02c6\u0001\u0000\u0000\u0000\u0013\u02c8\u0001"+ + "\u0000\u0000\u0000\u0014\u02ca\u0001\u0000\u0000\u0000\u0016\u02db\u0001"+ + "\u0000\u0000\u0000\u0018\u02eb\u0001\u0000\u0000\u0000\u001a\u02f1\u0001"+ + "\u0000\u0000\u0000\u001c\u0300\u0001\u0000\u0000\u0000\u001e\u0309\u0001"+ + "\u0000\u0000\u0000 \u0314\u0001\u0000\u0000\u0000\"\u0321\u0001\u0000"+ + "\u0000\u0000$\u032b\u0001\u0000\u0000\u0000&\u0332\u0001\u0000\u0000\u0000"+ + "(\u0339\u0001\u0000\u0000\u0000*\u0341\u0001\u0000\u0000\u0000,\u034a"+ + "\u0001\u0000\u0000\u0000.\u0350\u0001\u0000\u0000\u00000\u0359\u0001\u0000"+ + "\u0000\u00002\u0360\u0001\u0000\u0000\u00004\u0368\u0001\u0000\u0000\u0000"+ + "6\u0370\u0001\u0000\u0000\u00008\u037c\u0001\u0000\u0000\u0000:\u038b"+ + "\u0001\u0000\u0000\u0000<\u039f\u0001\u0000\u0000\u0000>\u03a9\u0001\u0000"+ + "\u0000\u0000@\u03b6\u0001\u0000\u0000\u0000B\u03bd\u0001\u0000\u0000\u0000"+ + "D\u03c2\u0001\u0000\u0000\u0000F\u03ce\u0001\u0000\u0000\u0000H\u03d5"+ + "\u0001\u0000\u0000\u0000J\u03dc\u0001\u0000\u0000\u0000L\u03e5\u0001\u0000"+ + "\u0000\u0000N\u03f3\u0001\u0000\u0000\u0000P\u03fc\u0001\u0000\u0000\u0000"+ + "R\u0404\u0001\u0000\u0000\u0000T\u040c\u0001\u0000\u0000\u0000V\u0415"+ + "\u0001\u0000\u0000\u0000X\u0421\u0001\u0000\u0000\u0000Z\u0427\u0001\u0000"+ + "\u0000\u0000\\\u0433\u0001\u0000\u0000\u0000^\u043a\u0001\u0000\u0000"+ + "\u0000`\u0441\u0001\u0000\u0000\u0000b\u044d\u0001\u0000\u0000\u0000d"+ + "\u0456\u0001\u0000\u0000\u0000f\u045f\u0001\u0000\u0000\u0000h\u0465\u0001"+ + "\u0000\u0000\u0000j\u046d\u0001\u0000\u0000\u0000l\u0473\u0001\u0000\u0000"+ + "\u0000n\u0478\u0001\u0000\u0000\u0000p\u047e\u0001\u0000\u0000\u0000r"+ + "\u0482\u0001\u0000\u0000\u0000t\u0486\u0001\u0000\u0000\u0000v\u048a\u0001"+ + "\u0000\u0000\u0000x\u048e\u0001\u0000\u0000\u0000z\u0492\u0001\u0000\u0000"+ + "\u0000|\u0496\u0001\u0000\u0000\u0000~\u049a\u0001\u0000\u0000\u0000\u0080"+ + "\u049e\u0001\u0000\u0000\u0000\u0082\u04a2\u0001\u0000\u0000\u0000\u0084"+ + "\u04a6\u0001\u0000\u0000\u0000\u0086\u04aa\u0001\u0000\u0000\u0000\u0088"+ + "\u04af\u0001\u0000\u0000\u0000\u008a\u04b5\u0001\u0000\u0000\u0000\u008c"+ + "\u04ba\u0001\u0000\u0000\u0000\u008e\u04bf\u0001\u0000\u0000\u0000\u0090"+ + "\u04c8\u0001\u0000\u0000\u0000\u0092\u04cf\u0001\u0000\u0000\u0000\u0094"+ + "\u04d3\u0001\u0000\u0000\u0000\u0096\u04d7\u0001\u0000\u0000\u0000\u0098"+ + "\u04db\u0001\u0000\u0000\u0000\u009a\u04df\u0001\u0000\u0000\u0000\u009c"+ + "\u04e3\u0001\u0000\u0000\u0000\u009e\u04e9\u0001\u0000\u0000\u0000\u00a0"+ + "\u04f0\u0001\u0000\u0000\u0000\u00a2\u04f4\u0001\u0000\u0000\u0000\u00a4"+ + "\u04f8\u0001\u0000\u0000\u0000\u00a6\u04fc\u0001\u0000\u0000\u0000\u00a8"+ + "\u0500\u0001\u0000\u0000\u0000\u00aa\u0504\u0001\u0000\u0000\u0000\u00ac"+ + "\u0508\u0001\u0000\u0000\u0000\u00ae\u050c\u0001\u0000\u0000\u0000\u00b0"+ + "\u0510\u0001\u0000\u0000\u0000\u00b2\u0514\u0001\u0000\u0000\u0000\u00b4"+ + "\u0518\u0001\u0000\u0000\u0000\u00b6\u051c\u0001\u0000\u0000\u0000\u00b8"+ + "\u0520\u0001\u0000\u0000\u0000\u00ba\u0524\u0001\u0000\u0000\u0000\u00bc"+ + "\u0528\u0001\u0000\u0000\u0000\u00be\u052c\u0001\u0000\u0000\u0000\u00c0"+ + "\u0531\u0001\u0000\u0000\u0000\u00c2\u0536\u0001\u0000\u0000\u0000\u00c4"+ + "\u053a\u0001\u0000\u0000\u0000\u00c6\u053e\u0001\u0000\u0000\u0000\u00c8"+ + "\u0542\u0001\u0000\u0000\u0000\u00ca\u0546\u0001\u0000\u0000\u0000\u00cc"+ + "\u0548\u0001\u0000\u0000\u0000\u00ce\u054a\u0001\u0000\u0000\u0000\u00d0"+ + "\u054d\u0001\u0000\u0000\u0000\u00d2\u054f\u0001\u0000\u0000\u0000\u00d4"+ + "\u0558\u0001\u0000\u0000\u0000\u00d6\u055a\u0001\u0000\u0000\u0000\u00d8"+ + "\u055f\u0001\u0000\u0000\u0000\u00da\u0561\u0001\u0000\u0000\u0000\u00dc"+ + "\u0566\u0001\u0000\u0000\u0000\u00de\u0585\u0001\u0000\u0000\u0000\u00e0"+ + "\u0588\u0001\u0000\u0000\u0000\u00e2\u05b6\u0001\u0000\u0000\u0000\u00e4"+ + "\u05b8\u0001\u0000\u0000\u0000\u00e6\u05bc\u0001\u0000\u0000\u0000\u00e8"+ + "\u05c0\u0001\u0000\u0000\u0000\u00ea\u05c2\u0001\u0000\u0000\u0000\u00ec"+ + "\u05c5\u0001\u0000\u0000\u0000\u00ee\u05c8\u0001\u0000\u0000\u0000\u00f0"+ + "\u05ca\u0001\u0000\u0000\u0000\u00f2\u05cc\u0001\u0000\u0000\u0000\u00f4"+ + "\u05ce\u0001\u0000\u0000\u0000\u00f6\u05d3\u0001\u0000\u0000\u0000\u00f8"+ + "\u05d5\u0001\u0000\u0000\u0000\u00fa\u05db\u0001\u0000\u0000\u0000\u00fc"+ + "\u05e1\u0001\u0000\u0000\u0000\u00fe\u05e4\u0001\u0000\u0000\u0000\u0100"+ + "\u05e7\u0001\u0000\u0000\u0000\u0102\u05ec\u0001\u0000\u0000\u0000\u0104"+ + "\u05f1\u0001\u0000\u0000\u0000\u0106\u05f5\u0001\u0000\u0000\u0000\u0108"+ + "\u05fa\u0001\u0000\u0000\u0000\u010a\u0600\u0001\u0000\u0000\u0000\u010c"+ + "\u0603\u0001\u0000\u0000\u0000\u010e\u0606\u0001\u0000\u0000\u0000\u0110"+ + "\u0608\u0001\u0000\u0000\u0000\u0112\u060e\u0001\u0000\u0000\u0000\u0114"+ + "\u0613\u0001\u0000\u0000\u0000\u0116\u0618\u0001\u0000\u0000\u0000\u0118"+ + "\u061b\u0001\u0000\u0000\u0000\u011a\u061e\u0001\u0000\u0000\u0000\u011c"+ + "\u0621\u0001\u0000\u0000\u0000\u011e\u0623\u0001\u0000\u0000\u0000\u0120"+ + "\u0626\u0001\u0000\u0000\u0000\u0122\u0628\u0001\u0000\u0000\u0000\u0124"+ + "\u062b\u0001\u0000\u0000\u0000\u0126\u062d\u0001\u0000\u0000\u0000\u0128"+ + "\u062f\u0001\u0000\u0000\u0000\u012a\u0631\u0001\u0000\u0000\u0000\u012c"+ + "\u0633\u0001\u0000\u0000\u0000\u012e\u0635\u0001\u0000\u0000\u0000\u0130"+ + "\u0637\u0001\u0000\u0000\u0000\u0132\u0639\u0001\u0000\u0000\u0000\u0134"+ + "\u063c\u0001\u0000\u0000\u0000\u0136\u0651\u0001\u0000\u0000\u0000\u0138"+ + "\u0664\u0001\u0000\u0000\u0000\u013a\u0666\u0001\u0000\u0000\u0000\u013c"+ + "\u066b\u0001\u0000\u0000\u0000\u013e\u0670\u0001\u0000\u0000\u0000\u0140"+ + "\u0675\u0001\u0000\u0000\u0000\u0142\u068a\u0001\u0000\u0000\u0000\u0144"+ + "\u068c\u0001\u0000\u0000\u0000\u0146\u0694\u0001\u0000\u0000\u0000\u0148"+ + "\u0696\u0001\u0000\u0000\u0000\u014a\u069a\u0001\u0000\u0000\u0000\u014c"+ + "\u069e\u0001\u0000\u0000\u0000\u014e\u06a2\u0001\u0000\u0000\u0000\u0150"+ + "\u06a7\u0001\u0000\u0000\u0000\u0152\u06ab\u0001\u0000\u0000\u0000\u0154"+ + "\u06af\u0001\u0000\u0000\u0000\u0156\u06b3\u0001\u0000\u0000\u0000\u0158"+ + "\u06b7\u0001\u0000\u0000\u0000\u015a\u06c0\u0001\u0000\u0000\u0000\u015c"+ + "\u06c6\u0001\u0000\u0000\u0000\u015e\u06ca\u0001\u0000\u0000\u0000\u0160"+ + "\u06ce\u0001\u0000\u0000\u0000\u0162\u06d4\u0001\u0000\u0000\u0000\u0164"+ + "\u06dc\u0001\u0000\u0000\u0000\u0166\u06df\u0001\u0000\u0000\u0000\u0168"+ + "\u06e3\u0001\u0000\u0000\u0000\u016a\u06e7\u0001\u0000\u0000\u0000\u016c"+ + "\u06eb\u0001\u0000\u0000\u0000\u016e\u06ef\u0001\u0000\u0000\u0000\u0170"+ + "\u06f3\u0001\u0000\u0000\u0000\u0172\u06f7\u0001\u0000\u0000\u0000\u0174"+ + "\u06fc\u0001\u0000\u0000\u0000\u0176\u0702\u0001\u0000\u0000\u0000\u0178"+ + "\u0707\u0001\u0000\u0000\u0000\u017a\u070b\u0001\u0000\u0000\u0000\u017c"+ + "\u070f\u0001\u0000\u0000\u0000\u017e\u0713\u0001\u0000\u0000\u0000\u0180"+ + "\u0718\u0001\u0000\u0000\u0000\u0182\u071e\u0001\u0000\u0000\u0000\u0184"+ + "\u0724\u0001\u0000\u0000\u0000\u0186\u072a\u0001\u0000\u0000\u0000\u0188"+ + "\u072e\u0001\u0000\u0000\u0000\u018a\u0734\u0001\u0000\u0000\u0000\u018c"+ + "\u0738\u0001\u0000\u0000\u0000\u018e\u073c\u0001\u0000\u0000\u0000\u0190"+ + "\u0740\u0001\u0000\u0000\u0000\u0192\u0744\u0001\u0000\u0000\u0000\u0194"+ + "\u0748\u0001\u0000\u0000\u0000\u0196\u074c\u0001\u0000\u0000\u0000\u0198"+ + "\u0750\u0001\u0000\u0000\u0000\u019a\u0754\u0001\u0000\u0000\u0000\u019c"+ + "\u0758\u0001\u0000\u0000\u0000\u019e\u075c\u0001\u0000\u0000\u0000\u01a0"+ + "\u0760\u0001\u0000\u0000\u0000\u01a2\u0764\u0001\u0000\u0000\u0000\u01a4"+ + "\u076d\u0001\u0000\u0000\u0000\u01a6\u0771\u0001\u0000\u0000\u0000\u01a8"+ + "\u0775\u0001\u0000\u0000\u0000\u01aa\u0779\u0001\u0000\u0000\u0000\u01ac"+ + "\u077e\u0001\u0000\u0000\u0000\u01ae\u0783\u0001\u0000\u0000\u0000\u01b0"+ + "\u0787\u0001\u0000\u0000\u0000\u01b2\u078d\u0001\u0000\u0000\u0000\u01b4"+ + "\u0796\u0001\u0000\u0000\u0000\u01b6\u079a\u0001\u0000\u0000\u0000\u01b8"+ + "\u079e\u0001\u0000\u0000\u0000\u01ba\u07a2\u0001\u0000\u0000\u0000\u01bc"+ + "\u07a6\u0001\u0000\u0000\u0000\u01be\u07aa\u0001\u0000\u0000\u0000\u01c0"+ + "\u07ae\u0001\u0000\u0000\u0000\u01c2\u07b3\u0001\u0000\u0000\u0000\u01c4"+ + "\u07b9\u0001\u0000\u0000\u0000\u01c6\u07bd\u0001\u0000\u0000\u0000\u01c8"+ + "\u07c1\u0001\u0000\u0000\u0000\u01ca\u07c5\u0001\u0000\u0000\u0000\u01cc"+ + "\u07ca\u0001\u0000\u0000\u0000\u01ce\u07ce\u0001\u0000\u0000\u0000\u01d0"+ + "\u07d2\u0001\u0000\u0000\u0000\u01d2\u07d6\u0001\u0000\u0000\u0000\u01d4"+ + "\u07da\u0001\u0000\u0000\u0000\u01d6\u07de\u0001\u0000\u0000\u0000\u01d8"+ + "\u07e4\u0001\u0000\u0000\u0000\u01da\u07eb\u0001\u0000\u0000\u0000\u01dc"+ + "\u07ef\u0001\u0000\u0000\u0000\u01de\u07f3\u0001\u0000\u0000\u0000\u01e0"+ + "\u07f7\u0001\u0000\u0000\u0000\u01e2\u07fb\u0001\u0000\u0000\u0000\u01e4"+ + "\u07ff\u0001\u0000\u0000\u0000\u01e6\u0803\u0001\u0000\u0000\u0000\u01e8"+ + "\u0808\u0001\u0000\u0000\u0000\u01ea\u080c\u0001\u0000\u0000\u0000\u01ec"+ + "\u0810\u0001\u0000\u0000\u0000\u01ee\u0814\u0001\u0000\u0000\u0000\u01f0"+ + "\u0818\u0001\u0000\u0000\u0000\u01f2\u081c\u0001\u0000\u0000\u0000\u01f4"+ + "\u0820\u0001\u0000\u0000\u0000\u01f6\u0824\u0001\u0000\u0000\u0000\u01f8"+ + "\u0828\u0001\u0000\u0000\u0000\u01fa\u082c\u0001\u0000\u0000\u0000\u01fc"+ + "\u0830\u0001\u0000\u0000\u0000\u01fe\u0834\u0001\u0000\u0000\u0000\u0200"+ + "\u0838\u0001\u0000\u0000\u0000\u0202\u083c\u0001\u0000\u0000\u0000\u0204"+ + "\u0840\u0001\u0000\u0000\u0000\u0206\u0844\u0001\u0000\u0000\u0000\u0208"+ + "\u0848\u0001\u0000\u0000\u0000\u020a\u084c\u0001\u0000\u0000\u0000\u020c"+ + "\u0850\u0001\u0000\u0000\u0000\u020e\u0855\u0001\u0000\u0000\u0000\u0210"+ + "\u085b\u0001\u0000\u0000\u0000\u0212\u085f\u0001\u0000\u0000\u0000\u0214"+ + "\u0863\u0001\u0000\u0000\u0000\u0216\u0867\u0001\u0000\u0000\u0000\u0218"+ + "\u086b\u0001\u0000\u0000\u0000\u021a\u086f\u0001\u0000\u0000\u0000\u021c"+ + "\u0873\u0001\u0000\u0000\u0000\u021e\u0877\u0001\u0000\u0000\u0000\u0220"+ + "\u087b\u0001\u0000\u0000\u0000\u0222\u087f\u0001\u0000\u0000\u0000\u0224"+ + "\u0883\u0001\u0000\u0000\u0000\u0226\u0887\u0001\u0000\u0000\u0000\u0228"+ + "\u088b\u0001\u0000\u0000\u0000\u022a\u0890\u0001\u0000\u0000\u0000\u022c"+ + "\u0896\u0001\u0000\u0000\u0000\u022e\u089a\u0001\u0000\u0000\u0000\u0230"+ + "\u089e\u0001\u0000\u0000\u0000\u0232\u08a2\u0001\u0000\u0000\u0000\u0234"+ + "\u08a6\u0001\u0000\u0000\u0000\u0236\u08aa\u0001\u0000\u0000\u0000\u0238"+ + "\u08ae\u0001\u0000\u0000\u0000\u023a\u08b2\u0001\u0000\u0000\u0000\u023c"+ + "\u08ba\u0001\u0000\u0000\u0000\u023e\u08cf\u0001\u0000\u0000\u0000\u0240"+ + "\u08d3\u0001\u0000\u0000\u0000\u0242\u08d7\u0001\u0000\u0000\u0000\u0244"+ + "\u08db\u0001\u0000\u0000\u0000\u0246\u08df\u0001\u0000\u0000\u0000\u0248"+ + "\u08e3\u0001\u0000\u0000\u0000\u024a\u08e7\u0001\u0000\u0000\u0000\u024c"+ + "\u08eb\u0001\u0000\u0000\u0000\u024e\u08ef\u0001\u0000\u0000\u0000\u0250"+ + "\u08f3\u0001\u0000\u0000\u0000\u0252\u08f7\u0001\u0000\u0000\u0000\u0254"+ + "\u08fb\u0001\u0000\u0000\u0000\u0256\u08ff\u0001\u0000\u0000\u0000\u0258"+ + "\u0903\u0001\u0000\u0000\u0000\u025a\u0907\u0001\u0000\u0000\u0000\u025c"+ + "\u090c\u0001\u0000\u0000\u0000\u025e\u0911\u0001\u0000\u0000\u0000\u0260"+ + "\u0917\u0001\u0000\u0000\u0000\u0262\u091e\u0001\u0000\u0000\u0000\u0264"+ + "\u0922\u0001\u0000\u0000\u0000\u0266\u0926\u0001\u0000\u0000\u0000\u0268"+ + "\u092a\u0001\u0000\u0000\u0000\u026a\u0937\u0001\u0000\u0000\u0000\u026c"+ + "\u0942\u0001\u0000\u0000\u0000\u026e\u0944\u0001\u0000\u0000\u0000\u0270"+ + "\u0949\u0001\u0000\u0000\u0000\u0272\u094f\u0001\u0000\u0000\u0000\u0274"+ + "\u0953\u0001\u0000\u0000\u0000\u0276\u0957\u0001\u0000\u0000\u0000\u0278"+ + "\u095b\u0001\u0000\u0000\u0000\u027a\u095f\u0001\u0000\u0000\u0000\u027c"+ + "\u0963\u0001\u0000\u0000\u0000\u027e\u0967\u0001\u0000\u0000\u0000\u0280"+ + "\u096b\u0001\u0000\u0000\u0000\u0282\u096f\u0001\u0000\u0000\u0000\u0284"+ + "\u0973\u0001\u0000\u0000\u0000\u0286\u0976\u0001\u0000\u0000\u0000\u0288"+ + "\u097a\u0001\u0000\u0000\u0000\u028a\u097e\u0001\u0000\u0000\u0000\u028c"+ + "\u0982\u0001\u0000\u0000\u0000\u028e\u0986\u0001\u0000\u0000\u0000\u0290"+ + "\u098a\u0001\u0000\u0000\u0000\u0292\u098e\u0001\u0000\u0000\u0000\u0294"+ + "\u0992\u0001\u0000\u0000\u0000\u0296\u0997\u0001\u0000\u0000\u0000\u0298"+ + "\u099b\u0001\u0000\u0000\u0000\u029a\u099f\u0001\u0000\u0000\u0000\u029c"+ + "\u09a3\u0001\u0000\u0000\u0000\u029e\u09a7\u0001\u0000\u0000\u0000\u02a0"+ + "\u09ab\u0001\u0000\u0000\u0000\u02a2\u09af\u0001\u0000\u0000\u0000\u02a4"+ + "\u09b3\u0001\u0000\u0000\u0000\u02a6\u09b7\u0001\u0000\u0000\u0000\u02a8"+ + "\u09bb\u0001\u0000\u0000\u0000\u02aa\u09bf\u0001\u0000\u0000\u0000\u02ac"+ + "\u09c3\u0001\u0000\u0000\u0000\u02ae\u09c7\u0001\u0000\u0000\u0000\u02b0"+ + "\u09cb\u0001\u0000\u0000\u0000\u02b2\u09cf\u0001\u0000\u0000\u0000\u02b4"+ + "\u09d3\u0001\u0000\u0000\u0000\u02b6\u09d7\u0001\u0000\u0000\u0000\u02b8"+ + "\u09db\u0001\u0000\u0000\u0000\u02ba\u09df\u0001\u0000\u0000\u0000\u02bc"+ + "\u09e3\u0001\u0000\u0000\u0000\u02be\u09e7\u0001\u0000\u0000\u0000\u02c0"+ + "\u09eb\u0001\u0000\u0000\u0000\u02c2\u09f0\u0001\u0000\u0000\u0000\u02c4"+ + "\u09f5\u0001\u0000\u0000\u0000\u02c6\u09f9\u0001\u0000\u0000\u0000\u02c8"+ + "\u09fd\u0001\u0000\u0000\u0000\u02ca\u02cb\u0005/\u0000\u0000\u02cb\u02cc"+ + "\u0005/\u0000\u0000\u02cc\u02d0\u0001\u0000\u0000\u0000\u02cd\u02cf\b"+ + "\u0000\u0000\u0000\u02ce\u02cd\u0001\u0000\u0000\u0000\u02cf\u02d2\u0001"+ + "\u0000\u0000\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000\u02d0\u02d1\u0001"+ + "\u0000\u0000\u0000\u02d1\u02d4\u0001\u0000\u0000\u0000\u02d2\u02d0\u0001"+ + "\u0000\u0000\u0000\u02d3\u02d5\u0005\r\u0000\u0000\u02d4\u02d3\u0001\u0000"+ + "\u0000\u0000\u02d4\u02d5\u0001\u0000\u0000\u0000\u02d5\u02d7\u0001\u0000"+ + "\u0000\u0000\u02d6\u02d8\u0005\n\u0000\u0000\u02d7\u02d6\u0001\u0000\u0000"+ + "\u0000\u02d7\u02d8\u0001\u0000\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000"+ + "\u0000\u02d9\u02da\u0006\u0000\u0000\u0000\u02da\u0015\u0001\u0000\u0000"+ + "\u0000\u02db\u02dc\u0005/\u0000\u0000\u02dc\u02dd\u0005*\u0000\u0000\u02dd"+ + "\u02e2\u0001\u0000\u0000\u0000\u02de\u02e1\u0003\u0016\u0001\u0000\u02df"+ + "\u02e1\t\u0000\u0000\u0000\u02e0\u02de\u0001\u0000\u0000\u0000\u02e0\u02df"+ + "\u0001\u0000\u0000\u0000\u02e1\u02e4\u0001\u0000\u0000\u0000\u02e2\u02e3"+ + "\u0001\u0000\u0000\u0000\u02e2\u02e0\u0001\u0000\u0000\u0000\u02e3\u02e5"+ + "\u0001\u0000\u0000\u0000\u02e4\u02e2\u0001\u0000\u0000\u0000\u02e5\u02e6"+ + "\u0005*\u0000\u0000\u02e6\u02e7\u0005/\u0000\u0000\u02e7\u02e8\u0001\u0000"+ + "\u0000\u0000\u02e8\u02e9\u0006\u0001\u0000\u0000\u02e9\u0017\u0001\u0000"+ + "\u0000\u0000\u02ea\u02ec\u0007\u0001\u0000\u0000\u02eb\u02ea\u0001\u0000"+ + "\u0000\u0000\u02ec\u02ed\u0001\u0000\u0000\u0000\u02ed\u02eb\u0001\u0000"+ + "\u0000\u0000\u02ed\u02ee\u0001\u0000\u0000\u0000\u02ee\u02ef\u0001\u0000"+ + "\u0000\u0000\u02ef\u02f0\u0006\u0002\u0000\u0000\u02f0\u0019\u0001\u0000"+ + "\u0000\u0000\u02f1\u02f2\u0007\u0002\u0000\u0000\u02f2\u02f3\u0007\u0003"+ + "\u0000\u0000\u02f3\u02f4\u0007\u0004\u0000\u0000\u02f4\u02f5\u0007\u0005"+ + "\u0000\u0000\u02f5\u02f6\u0007\u0006\u0000\u0000\u02f6\u02f7\u0007\u0007"+ + "\u0000\u0000\u02f7\u02f8\u0005_\u0000\u0000\u02f8\u02f9\u0007\b\u0000"+ + "\u0000\u02f9\u02fa\u0007\t\u0000\u0000\u02fa\u02fb\u0007\n\u0000\u0000"+ + "\u02fb\u02fc\u0007\u0005\u0000\u0000\u02fc\u02fd\u0007\u000b\u0000\u0000"+ + "\u02fd\u02fe\u0001\u0000\u0000\u0000\u02fe\u02ff\u0006\u0003\u0001\u0000"+ + "\u02ff\u001b\u0001\u0000\u0000\u0000\u0300\u0301\u0007\u0007\u0000\u0000"+ + "\u0301\u0302\u0007\u0005\u0000\u0000\u0302\u0303\u0007\f\u0000\u0000\u0303"+ + "\u0304\u0007\n\u0000\u0000\u0304\u0305\u0007\u0002\u0000\u0000\u0305\u0306"+ + "\u0007\u0003\u0000\u0000\u0306\u0307\u0001\u0000\u0000\u0000\u0307\u0308"+ + "\u0006\u0004\u0002\u0000\u0308\u001d\u0001\u0000\u0000\u0000\u0309\u030a"+ + "\u0004\u0005\u0000\u0000\u030a\u030b\u0007\u0007\u0000\u0000\u030b\u030c"+ + "\u0007\r\u0000\u0000\u030c\u030d\u0007\b\u0000\u0000\u030d\u030e\u0007"+ + "\u000e\u0000\u0000\u030e\u030f\u0007\u0004\u0000\u0000\u030f\u0310\u0007"+ + "\n\u0000\u0000\u0310\u0311\u0007\u0005\u0000\u0000\u0311\u0312\u0001\u0000"+ + "\u0000\u0000\u0312\u0313\u0006\u0005\u0003\u0000\u0313\u001f\u0001\u0000"+ + "\u0000\u0000\u0314\u0315\u0007\u0002\u0000\u0000\u0315\u0316\u0007\t\u0000"+ + "\u0000\u0316\u0317\u0007\u000f\u0000\u0000\u0317\u0318\u0007\b\u0000\u0000"+ + "\u0318\u0319\u0007\u000e\u0000\u0000\u0319\u031a\u0007\u0007\u0000\u0000"+ + "\u031a\u031b\u0007\u000b\u0000\u0000\u031b\u031c\u0007\n\u0000\u0000\u031c"+ + "\u031d\u0007\t\u0000\u0000\u031d\u031e\u0007\u0005\u0000\u0000\u031e\u031f"+ + "\u0001\u0000\u0000\u0000\u031f\u0320\u0006\u0006\u0004\u0000\u0320!\u0001"+ + "\u0000\u0000\u0000\u0321\u0322\u0007\u0010\u0000\u0000\u0322\u0323\u0007"+ + "\n\u0000\u0000\u0323\u0324\u0007\u0011\u0000\u0000\u0324\u0325\u0007\u0011"+ + "\u0000\u0000\u0325\u0326\u0007\u0007\u0000\u0000\u0326\u0327\u0007\u0002"+ + "\u0000\u0000\u0327\u0328\u0007\u000b\u0000\u0000\u0328\u0329\u0001\u0000"+ + "\u0000\u0000\u0329\u032a\u0006\u0007\u0004\u0000\u032a#\u0001\u0000\u0000"+ + "\u0000\u032b\u032c\u0007\u0007\u0000\u0000\u032c\u032d\u0007\u0012\u0000"+ + "\u0000\u032d\u032e\u0007\u0004\u0000\u0000\u032e\u032f\u0007\u000e\u0000"+ + "\u0000\u032f\u0330\u0001\u0000\u0000\u0000\u0330\u0331\u0006\b\u0004\u0000"+ + "\u0331%\u0001\u0000\u0000\u0000\u0332\u0333\u0007\u0006\u0000\u0000\u0333"+ + "\u0334\u0007\f\u0000\u0000\u0334\u0335\u0007\t\u0000\u0000\u0335\u0336"+ + "\u0007\u0013\u0000\u0000\u0336\u0337\u0001\u0000\u0000\u0000\u0337\u0338"+ + "\u0006\t\u0004\u0000\u0338\'\u0001\u0000\u0000\u0000\u0339\u033a\u0007"+ + "\u000e\u0000\u0000\u033a\u033b\u0007\n\u0000\u0000\u033b\u033c\u0007\u000f"+ + "\u0000\u0000\u033c\u033d\u0007\n\u0000\u0000\u033d\u033e\u0007\u000b\u0000"+ + "\u0000\u033e\u033f\u0001\u0000\u0000\u0000\u033f\u0340\u0006\n\u0004\u0000"+ + "\u0340)\u0001\u0000\u0000\u0000\u0341\u0342\u0007\f\u0000\u0000\u0342"+ + "\u0343\u0007\u0007\u0000\u0000\u0343\u0344\u0007\f\u0000\u0000\u0344\u0345"+ + "\u0007\u0004\u0000\u0000\u0345\u0346\u0007\u0005\u0000\u0000\u0346\u0347"+ + "\u0007\u0013\u0000\u0000\u0347\u0348\u0001\u0000\u0000\u0000\u0348\u0349"+ + "\u0006\u000b\u0004\u0000\u0349+\u0001\u0000\u0000\u0000\u034a\u034b\u0007"+ + "\f\u0000\u0000\u034b\u034c\u0007\t\u0000\u0000\u034c\u034d\u0007\u0014"+ + "\u0000\u0000\u034d\u034e\u0001\u0000\u0000\u0000\u034e\u034f\u0006\f\u0004"+ + "\u0000\u034f-\u0001\u0000\u0000\u0000\u0350\u0351\u0007\u0011\u0000\u0000"+ + "\u0351\u0352\u0007\u0004\u0000\u0000\u0352\u0353\u0007\u000f\u0000\u0000"+ + "\u0353\u0354\u0007\b\u0000\u0000\u0354\u0355\u0007\u000e\u0000\u0000\u0355"+ + "\u0356\u0007\u0007\u0000\u0000\u0356\u0357\u0001\u0000\u0000\u0000\u0357"+ + "\u0358\u0006\r\u0004\u0000\u0358/\u0001\u0000\u0000\u0000\u0359\u035a"+ + "\u0007\u0011\u0000\u0000\u035a\u035b\u0007\t\u0000\u0000\u035b\u035c\u0007"+ + "\f\u0000\u0000\u035c\u035d\u0007\u000b\u0000\u0000\u035d\u035e\u0001\u0000"+ + "\u0000\u0000\u035e\u035f\u0006\u000e\u0004\u0000\u035f1\u0001\u0000\u0000"+ + "\u0000\u0360\u0361\u0007\u0011\u0000\u0000\u0361\u0362\u0007\u000b\u0000"+ + "\u0000\u0362\u0363\u0007\u0004\u0000\u0000\u0363\u0364\u0007\u000b\u0000"+ + "\u0000\u0364\u0365\u0007\u0011\u0000\u0000\u0365\u0366\u0001\u0000\u0000"+ + "\u0000\u0366\u0367\u0006\u000f\u0004\u0000\u03673\u0001\u0000\u0000\u0000"+ + "\u0368\u0369\u0007\u0014\u0000\u0000\u0369\u036a\u0007\u0003\u0000\u0000"+ + "\u036a\u036b\u0007\u0007\u0000\u0000\u036b\u036c\u0007\f\u0000\u0000\u036c"+ + "\u036d\u0007\u0007\u0000\u0000\u036d\u036e\u0001\u0000\u0000\u0000\u036e"+ + "\u036f\u0006\u0010\u0004\u0000\u036f5\u0001\u0000\u0000\u0000\u0370\u0371"+ + "\u0007\u0015\u0000\u0000\u0371\u0372\u0007\f\u0000\u0000\u0372\u0373\u0007"+ + "\n\u0000\u0000\u0373\u0374\u0005_\u0000\u0000\u0374\u0375\u0007\b\u0000"+ + "\u0000\u0375\u0376\u0007\u0004\u0000\u0000\u0376\u0377\u0007\f\u0000\u0000"+ + "\u0377\u0378\u0007\u000b\u0000\u0000\u0378\u0379\u0007\u0011\u0000\u0000"+ + "\u0379\u037a\u0001\u0000\u0000\u0000\u037a\u037b\u0006\u0011\u0004\u0000"+ + "\u037b7\u0001\u0000\u0000\u0000\u037c\u037d\u0007\u000f\u0000\u0000\u037d"+ + "\u037e\u0007\u0007\u0000\u0000\u037e\u037f\u0007\u000b\u0000\u0000\u037f"+ + "\u0380\u0007\f\u0000\u0000\u0380\u0381\u0007\n\u0000\u0000\u0381\u0382"+ + "\u0007\u0002\u0000\u0000\u0382\u0383\u0007\u0011\u0000\u0000\u0383\u0384"+ + "\u0005_\u0000\u0000\u0384\u0385\u0007\n\u0000\u0000\u0385\u0386\u0007"+ + "\u0005\u0000\u0000\u0386\u0387\u0007\u0016\u0000\u0000\u0387\u0388\u0007"+ + "\t\u0000\u0000\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u038a\u0006\u0012"+ + "\u0004\u0000\u038a9\u0001\u0000\u0000\u0000\u038b\u038c\u0007\f\u0000"+ + "\u0000\u038c\u038d\u0007\u0007\u0000\u0000\u038d\u038e\u0007\u0006\u0000"+ + "\u0000\u038e\u038f\u0007\n\u0000\u0000\u038f\u0390\u0007\u0011\u0000\u0000"+ + "\u0390\u0391\u0007\u000b\u0000\u0000\u0391\u0392\u0007\u0007\u0000\u0000"+ + "\u0392\u0393\u0007\f\u0000\u0000\u0393\u0394\u0007\u0007\u0000\u0000\u0394"+ + "\u0395\u0007\u0010\u0000\u0000\u0395\u0396\u0005_\u0000\u0000\u0396\u0397"+ + "\u0007\u0010\u0000\u0000\u0397\u0398\u0007\t\u0000\u0000\u0398\u0399\u0007"+ + "\u000f\u0000\u0000\u0399\u039a\u0007\u0004\u0000\u0000\u039a\u039b\u0007"+ + "\n\u0000\u0000\u039b\u039c\u0007\u0005\u0000\u0000\u039c\u039d\u0001\u0000"+ + "\u0000\u0000\u039d\u039e\u0006\u0013\u0004\u0000\u039e;\u0001\u0000\u0000"+ + "\u0000\u039f\u03a0\u0007\u000b\u0000\u0000\u03a0\u03a1\u0007\u0011\u0000"+ + "\u0000\u03a1\u03a2\u0005_\u0000\u0000\u03a2\u03a3\u0007\n\u0000\u0000"+ + "\u03a3\u03a4\u0007\u0005\u0000\u0000\u03a4\u03a5\u0007\u0016\u0000\u0000"+ + "\u03a5\u03a6\u0007\t\u0000\u0000\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7"+ + "\u03a8\u0006\u0014\u0004\u0000\u03a8=\u0001\u0000\u0000\u0000\u03a9\u03aa"+ + "\u0007\u0015\u0000\u0000\u03aa\u03ab\u0007\u0011\u0000\u0000\u03ab\u03ac"+ + "\u0007\u0007\u0000\u0000\u03ac\u03ad\u0007\f\u0000\u0000\u03ad\u03ae\u0005"+ + "_\u0000\u0000\u03ae\u03af\u0007\u0004\u0000\u0000\u03af\u03b0\u0007\u0006"+ + "\u0000\u0000\u03b0\u03b1\u0007\u0007\u0000\u0000\u03b1\u03b2\u0007\u0005"+ + "\u0000\u0000\u03b2\u03b3\u0007\u000b\u0000\u0000\u03b3\u03b4\u0001\u0000"+ + "\u0000\u0000\u03b4\u03b5\u0006\u0015\u0004\u0000\u03b5?\u0001\u0000\u0000"+ + "\u0000\u03b6\u03b7\u0007\u0016\u0000\u0000\u03b7\u03b8\u0007\f\u0000\u0000"+ + "\u03b8\u03b9\u0007\t\u0000\u0000\u03b9\u03ba\u0007\u000f\u0000\u0000\u03ba"+ + "\u03bb\u0001\u0000\u0000\u0000\u03bb\u03bc\u0006\u0016\u0005\u0000\u03bc"+ + "A\u0001\u0000\u0000\u0000\u03bd\u03be\u0007\u000b\u0000\u0000\u03be\u03bf"+ + "\u0007\u0011\u0000\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u03c1"+ + "\u0006\u0017\u0005\u0000\u03c1C\u0001\u0000\u0000\u0000\u03c2\u03c3\u0004"+ + "\u0018\u0001\u0000\u03c3\u03c4\u0007\u0007\u0000\u0000\u03c4\u03c5\u0007"+ + "\r\u0000\u0000\u03c5\u03c6\u0007\u000b\u0000\u0000\u03c6\u03c7\u0007\u0007"+ + "\u0000\u0000\u03c7\u03c8\u0007\f\u0000\u0000\u03c8\u03c9\u0007\u0005\u0000"+ + "\u0000\u03c9\u03ca\u0007\u0004\u0000\u0000\u03ca\u03cb\u0007\u000e\u0000"+ + "\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000\u03cc\u03cd\u0006\u0018\u0005"+ + "\u0000\u03cdE\u0001\u0000\u0000\u0000\u03ce\u03cf\u0007\u0016\u0000\u0000"+ + "\u03cf\u03d0\u0007\t\u0000\u0000\u03d0\u03d1\u0007\f\u0000\u0000\u03d1"+ + "\u03d2\u0007\u0013\u0000\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3"+ + "\u03d4\u0006\u0019\u0006\u0000\u03d4G\u0001\u0000\u0000\u0000\u03d5\u03d6"+ + "\u0007\u0016\u0000\u0000\u03d6\u03d7\u0007\u0015\u0000\u0000\u03d7\u03d8"+ + "\u0007\u0011\u0000\u0000\u03d8\u03d9\u0007\u0007\u0000\u0000\u03d9\u03da"+ + "\u0001\u0000\u0000\u0000\u03da\u03db\u0006\u001a\u0007\u0000\u03dbI\u0001"+ + "\u0000\u0000\u0000\u03dc\u03dd\u0007\n\u0000\u0000\u03dd\u03de\u0007\u0005"+ + "\u0000\u0000\u03de\u03df\u0007\u000e\u0000\u0000\u03df\u03e0\u0007\n\u0000"+ + "\u0000\u03e0\u03e1\u0007\u0005\u0000\u0000\u03e1\u03e2\u0007\u0007\u0000"+ + "\u0000\u03e2\u03e3\u0001\u0000\u0000\u0000\u03e3\u03e4\u0006\u001b\b\u0000"+ + "\u03e4K\u0001\u0000\u0000\u0000\u03e5\u03e6\u0007\n\u0000\u0000\u03e6"+ + "\u03e7\u0007\u0005\u0000\u0000\u03e7\u03e8\u0007\u000e\u0000\u0000\u03e8"+ + "\u03e9\u0007\n\u0000\u0000\u03e9\u03ea\u0007\u0005\u0000\u0000\u03ea\u03eb"+ + "\u0007\u0007\u0000\u0000\u03eb\u03ec\u0007\u0011\u0000\u0000\u03ec\u03ed"+ + "\u0007\u000b\u0000\u0000\u03ed\u03ee\u0007\u0004\u0000\u0000\u03ee\u03ef"+ + "\u0007\u000b\u0000\u0000\u03ef\u03f0\u0007\u0011\u0000\u0000\u03f0\u03f1"+ + "\u0001\u0000\u0000\u0000\u03f1\u03f2\u0006\u001c\u0004\u0000\u03f2M\u0001"+ + "\u0000\u0000\u0000\u03f3\u03f4\u0007\u000e\u0000\u0000\u03f4\u03f5\u0007"+ + "\t\u0000\u0000\u03f5\u03f6\u0007\t\u0000\u0000\u03f6\u03f7\u0007\u0013"+ + "\u0000\u0000\u03f7\u03f8\u0007\u0015\u0000\u0000\u03f8\u03f9\u0007\b\u0000"+ + "\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000\u03fa\u03fb\u0006\u001d\t\u0000"+ + "\u03fbO\u0001\u0000\u0000\u0000\u03fc\u03fd\u0004\u001e\u0002\u0000\u03fd"+ + "\u03fe\u0007\u0016\u0000\u0000\u03fe\u03ff\u0007\u0015\u0000\u0000\u03ff"+ + "\u0400\u0007\u000e\u0000\u0000\u0400\u0401\u0007\u000e\u0000\u0000\u0401"+ + "\u0402\u0001\u0000\u0000\u0000\u0402\u0403\u0006\u001e\t\u0000\u0403Q"+ + "\u0001\u0000\u0000\u0000\u0404\u0405\u0004\u001f\u0003\u0000\u0405\u0406"+ + "\u0007\u000e\u0000\u0000\u0406\u0407\u0007\u0007\u0000\u0000\u0407\u0408"+ + "\u0007\u0016\u0000\u0000\u0408\u0409\u0007\u000b\u0000\u0000\u0409\u040a"+ + "\u0001\u0000\u0000\u0000\u040a\u040b\u0006\u001f\t\u0000\u040bS\u0001"+ + "\u0000\u0000\u0000\u040c\u040d\u0004 \u0004\u0000\u040d\u040e\u0007\f"+ + "\u0000\u0000\u040e\u040f\u0007\n\u0000\u0000\u040f\u0410\u0007\u0006\u0000"+ + "\u0000\u0410\u0411\u0007\u0003\u0000\u0000\u0411\u0412\u0007\u000b\u0000"+ + "\u0000\u0412\u0413\u0001\u0000\u0000\u0000\u0413\u0414\u0006 \t\u0000"+ + "\u0414U\u0001\u0000\u0000\u0000\u0415\u0416\u0004!\u0005\u0000\u0416\u0417"+ + "\u0007\u000e\u0000\u0000\u0417\u0418\u0007\t\u0000\u0000\u0418\u0419\u0007"+ + "\t\u0000\u0000\u0419\u041a\u0007\u0013\u0000\u0000\u041a\u041b\u0007\u0015"+ + "\u0000\u0000\u041b\u041c\u0007\b\u0000\u0000\u041c\u041d\u0005_\u0000"+ + "\u0000\u041d\u041e\u0005\u8001\uf414\u0000\u0000\u041e\u041f\u0001\u0000"+ + "\u0000\u0000\u041f\u0420\u0006!\n\u0000\u0420W\u0001\u0000\u0000\u0000"+ + "\u0421\u0422\u0007\u000f\u0000\u0000\u0422\u0423\u0007\u000f\u0000\u0000"+ + "\u0423\u0424\u0007\f\u0000\u0000\u0424\u0425\u0001\u0000\u0000\u0000\u0425"+ + "\u0426\u0006\"\u000b\u0000\u0426Y\u0001\u0000\u0000\u0000\u0427\u0428"+ + "\u0007\u000f\u0000\u0000\u0428\u0429\u0007\u0012\u0000\u0000\u0429\u042a"+ + "\u0005_\u0000\u0000\u042a\u042b\u0007\u0007\u0000\u0000\u042b\u042c\u0007"+ + "\r\u0000\u0000\u042c\u042d\u0007\b\u0000\u0000\u042d\u042e\u0007\u0004"+ + "\u0000\u0000\u042e\u042f\u0007\u0005\u0000\u0000\u042f\u0430\u0007\u0010"+ + "\u0000\u0000\u0430\u0431\u0001\u0000\u0000\u0000\u0431\u0432\u0006#\f"+ + "\u0000\u0432[\u0001\u0000\u0000\u0000\u0433\u0434\u0007\u0010\u0000\u0000"+ + "\u0434\u0435\u0007\f\u0000\u0000\u0435\u0436\u0007\t\u0000\u0000\u0436"+ + "\u0437\u0007\b\u0000\u0000\u0437\u0438\u0001\u0000\u0000\u0000\u0438\u0439"+ + "\u0006$\r\u0000\u0439]\u0001\u0000\u0000\u0000\u043a\u043b\u0007\u0013"+ + "\u0000\u0000\u043b\u043c\u0007\u0007\u0000\u0000\u043c\u043d\u0007\u0007"+ + "\u0000\u0000\u043d\u043e\u0007\b\u0000\u0000\u043e\u043f\u0001\u0000\u0000"+ + "\u0000\u043f\u0440\u0006%\r\u0000\u0440_\u0001\u0000\u0000\u0000\u0441"+ + "\u0442\u0004&\u0006\u0000\u0442\u0443\u0007\n\u0000\u0000\u0443\u0444"+ + "\u0007\u0005\u0000\u0000\u0444\u0445\u0007\u0011\u0000\u0000\u0445\u0446"+ + "\u0007\n\u0000\u0000\u0446\u0447\u0007\u0011\u0000\u0000\u0447\u0448\u0007"+ + "\u000b\u0000\u0000\u0448\u0449\u0005_\u0000\u0000\u0449\u044a\u0005\u8001"+ + "\uf414\u0000\u0000\u044a\u044b\u0001\u0000\u0000\u0000\u044b\u044c\u0006"+ + "&\r\u0000\u044ca\u0001\u0000\u0000\u0000\u044d\u044e\u0007\b\u0000\u0000"+ + "\u044e\u044f\u0007\f\u0000\u0000\u044f\u0450\u0007\t\u0000\u0000\u0450"+ + "\u0451\u0007\u000f\u0000\u0000\u0451\u0452\u0007\u0017\u0000\u0000\u0452"+ + "\u0453\u0007\u000e\u0000\u0000\u0453\u0454\u0001\u0000\u0000\u0000\u0454"+ + "\u0455\u0006\'\u000e\u0000\u0455c\u0001\u0000\u0000\u0000\u0456\u0457"+ + "\u0007\f\u0000\u0000\u0457\u0458\u0007\u0007\u0000\u0000\u0458\u0459\u0007"+ + "\u0005\u0000\u0000\u0459\u045a\u0007\u0004\u0000\u0000\u045a\u045b\u0007"+ + "\u000f\u0000\u0000\u045b\u045c\u0007\u0007\u0000\u0000\u045c\u045d\u0001"+ + "\u0000\u0000\u0000\u045d\u045e\u0006(\u000f\u0000\u045ee\u0001\u0000\u0000"+ + "\u0000\u045f\u0460\u0007\u0011\u0000\u0000\u0460\u0461\u0007\u0007\u0000"+ + "\u0000\u0461\u0462\u0007\u000b\u0000\u0000\u0462\u0463\u0001\u0000\u0000"+ + "\u0000\u0463\u0464\u0006)\u0010\u0000\u0464g\u0001\u0000\u0000\u0000\u0465"+ + "\u0466\u0007\u0011\u0000\u0000\u0466\u0467\u0007\u0003\u0000\u0000\u0467"+ + "\u0468\u0007\t\u0000\u0000\u0468\u0469\u0007\u0014\u0000\u0000\u0469\u046a"+ + "\u0001\u0000\u0000\u0000\u046a\u046b\u0006*\u0011\u0000\u046bi\u0001\u0000"+ + "\u0000\u0000\u046c\u046e\b\u0018\u0000\u0000\u046d\u046c\u0001\u0000\u0000"+ + "\u0000\u046e\u046f\u0001\u0000\u0000\u0000\u046f\u046d\u0001\u0000\u0000"+ + "\u0000\u046f\u0470\u0001\u0000\u0000\u0000\u0470\u0471\u0001\u0000\u0000"+ + "\u0000\u0471\u0472\u0006+\u0004\u0000\u0472k\u0001\u0000\u0000\u0000\u0473"+ + "\u0474\u0003\u00c8Z\u0000\u0474\u0475\u0001\u0000\u0000\u0000\u0475\u0476"+ + "\u0006,\u0012\u0000\u0476\u0477\u0006,\u0013\u0000\u0477m\u0001\u0000"+ + "\u0000\u0000\u0478\u0479\u0003\u0140\u0096\u0000\u0479\u047a\u0001\u0000"+ + "\u0000\u0000\u047a\u047b\u0006-\u0014\u0000\u047b\u047c\u0006-\u0013\u0000"+ + "\u047c\u047d\u0006-\u0013\u0000\u047do\u0001\u0000\u0000\u0000\u047e\u047f"+ + "\u0003\u010a{\u0000\u047f\u0480\u0001\u0000\u0000\u0000\u0480\u0481\u0006"+ + ".\u0015\u0000\u0481q\u0001\u0000\u0000\u0000\u0482\u0483\u0003\u0284\u0138"+ + "\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0485\u0006/\u0016\u0000"+ + "\u0485s\u0001\u0000\u0000\u0000\u0486\u0487\u0003\u00f6q\u0000\u0487\u0488"+ + "\u0001\u0000\u0000\u0000\u0488\u0489\u00060\u0017\u0000\u0489u\u0001\u0000"+ + "\u0000\u0000\u048a\u048b\u0003\u00f2o\u0000\u048b\u048c\u0001\u0000\u0000"+ + "\u0000\u048c\u048d\u00061\u0018\u0000\u048dw\u0001\u0000\u0000\u0000\u048e"+ + "\u048f\u0003\u013a\u0093\u0000\u048f\u0490\u0001\u0000\u0000\u0000\u0490"+ + "\u0491\u00062\u0019\u0000\u0491y\u0001\u0000\u0000\u0000\u0492\u0493\u0003"+ + "\u013c\u0094\u0000\u0493\u0494\u0001\u0000\u0000\u0000\u0494\u0495\u0006"+ + "3\u001a\u0000\u0495{\u0001\u0000\u0000\u0000\u0496\u0497\u0003\u0146\u0099"+ + "\u0000\u0497\u0498\u0001\u0000\u0000\u0000\u0498\u0499\u00064\u001b\u0000"+ + "\u0499}\u0001\u0000\u0000\u0000\u049a\u049b\u0003\u0142\u0097\u0000\u049b"+ + "\u049c\u0001\u0000\u0000\u0000\u049c\u049d\u00065\u001c\u0000\u049d\u007f"+ + "\u0001\u0000\u0000\u0000\u049e\u049f\u0003\u0014\u0000\u0000\u049f\u04a0"+ + "\u0001\u0000\u0000\u0000\u04a0\u04a1\u00066\u0000\u0000\u04a1\u0081\u0001"+ + "\u0000\u0000\u0000\u04a2\u04a3\u0003\u0016\u0001\u0000\u04a3\u04a4\u0001"+ + "\u0000\u0000\u0000\u04a4\u04a5\u00067\u0000\u0000\u04a5\u0083\u0001\u0000"+ + "\u0000\u0000\u04a6\u04a7\u0003\u0018\u0002\u0000\u04a7\u04a8\u0001\u0000"+ + "\u0000\u0000\u04a8\u04a9\u00068\u0000\u0000\u04a9\u0085\u0001\u0000\u0000"+ + "\u0000\u04aa\u04ab\u0003\u00c8Z\u0000\u04ab\u04ac\u0001\u0000\u0000\u0000"+ + "\u04ac\u04ad\u00069\u0012\u0000\u04ad\u04ae\u00069\u0013\u0000\u04ae\u0087"+ + "\u0001\u0000\u0000\u0000\u04af\u04b0\u0003\u0140\u0096\u0000\u04b0\u04b1"+ + "\u0001\u0000\u0000\u0000\u04b1\u04b2\u0006:\u0014\u0000\u04b2\u04b3\u0006"+ + ":\u0013\u0000\u04b3\u04b4\u0006:\u0013\u0000\u04b4\u0089\u0001\u0000\u0000"+ + "\u0000\u04b5\u04b6\u0003\u010a{\u0000\u04b6\u04b7\u0001\u0000\u0000\u0000"+ + "\u04b7\u04b8\u0006;\u0015\u0000\u04b8\u04b9\u0006;\u001d\u0000\u04b9\u008b"+ + "\u0001\u0000\u0000\u0000\u04ba\u04bb\u0003\u0114\u0080\u0000\u04bb\u04bc"+ + "\u0001\u0000\u0000\u0000\u04bc\u04bd\u0006<\u001e\u0000\u04bd\u04be\u0006"+ + "<\u001d\u0000\u04be\u008d\u0001\u0000\u0000\u0000\u04bf\u04c0\b\u0019"+ + "\u0000\u0000\u04c0\u008f\u0001\u0000\u0000\u0000\u04c1\u04c3\u0003\u008e"+ + "=\u0000\u04c2\u04c1\u0001\u0000\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000"+ + "\u0000\u04c4\u04c2\u0001\u0000\u0000\u0000\u04c4\u04c5\u0001\u0000\u0000"+ + "\u0000\u04c5\u04c6\u0001\u0000\u0000\u0000\u04c6\u04c7\u0003\u00eem\u0000"+ + "\u04c7\u04c9\u0001\u0000\u0000\u0000\u04c8\u04c2\u0001\u0000\u0000\u0000"+ + "\u04c8\u04c9\u0001\u0000\u0000\u0000\u04c9\u04cb\u0001\u0000\u0000\u0000"+ + "\u04ca\u04cc\u0003\u008e=\u0000\u04cb\u04ca\u0001\u0000\u0000\u0000\u04cc"+ + "\u04cd\u0001\u0000\u0000\u0000\u04cd\u04cb\u0001\u0000\u0000\u0000\u04cd"+ + "\u04ce\u0001\u0000\u0000\u0000\u04ce\u0091\u0001\u0000\u0000\u0000\u04cf"+ + "\u04d0\u0003\u0090>\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2"+ + "\u0006?\u001f\u0000\u04d2\u0093\u0001\u0000\u0000\u0000\u04d3\u04d4\u0003"+ + "\u00dee\u0000\u04d4\u04d5\u0001\u0000\u0000\u0000\u04d5\u04d6\u0006@ "+ + "\u0000\u04d6\u0095\u0001\u0000\u0000\u0000\u04d7\u04d8\u0003\u0014\u0000"+ + "\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000\u04d9\u04da\u0006A\u0000\u0000"+ + "\u04da\u0097\u0001\u0000\u0000\u0000\u04db\u04dc\u0003\u0016\u0001\u0000"+ + "\u04dc\u04dd\u0001\u0000\u0000\u0000\u04dd\u04de\u0006B\u0000\u0000\u04de"+ + "\u0099\u0001\u0000\u0000\u0000\u04df\u04e0\u0003\u0018\u0002\u0000\u04e0"+ + "\u04e1\u0001\u0000\u0000\u0000\u04e1\u04e2\u0006C\u0000\u0000\u04e2\u009b"+ + "\u0001\u0000\u0000\u0000\u04e3\u04e4\u0003\u00c8Z\u0000\u04e4\u04e5\u0001"+ + "\u0000\u0000\u0000\u04e5\u04e6\u0006D\u0012\u0000\u04e6\u04e7\u0006D\u0013"+ + "\u0000\u04e7\u04e8\u0006D\u0013\u0000\u04e8\u009d\u0001\u0000\u0000\u0000"+ + "\u04e9\u04ea\u0003\u0140\u0096\u0000\u04ea\u04eb\u0001\u0000\u0000\u0000"+ + "\u04eb\u04ec\u0006E\u0014\u0000\u04ec\u04ed\u0006E\u0013\u0000\u04ed\u04ee"+ + "\u0006E\u0013\u0000\u04ee\u04ef\u0006E\u0013\u0000\u04ef\u009f\u0001\u0000"+ + "\u0000\u0000\u04f0\u04f1\u0003\u013a\u0093\u0000\u04f1\u04f2\u0001\u0000"+ + "\u0000\u0000\u04f2\u04f3\u0006F\u0019\u0000\u04f3\u00a1\u0001\u0000\u0000"+ + "\u0000\u04f4\u04f5\u0003\u013c\u0094\u0000\u04f5\u04f6\u0001\u0000\u0000"+ + "\u0000\u04f6\u04f7\u0006G\u001a\u0000\u04f7\u00a3\u0001\u0000\u0000\u0000"+ + "\u04f8\u04f9\u0003\u00e8j\u0000\u04f9\u04fa\u0001\u0000\u0000\u0000\u04fa"+ + "\u04fb\u0006H!\u0000\u04fb\u00a5\u0001\u0000\u0000\u0000\u04fc\u04fd\u0003"+ + "\u00f2o\u0000\u04fd\u04fe\u0001\u0000\u0000\u0000\u04fe\u04ff\u0006I\u0018"+ + "\u0000\u04ff\u00a7\u0001\u0000\u0000\u0000\u0500\u0501\u0003\u00f6q\u0000"+ + "\u0501\u0502\u0001\u0000\u0000\u0000\u0502\u0503\u0006J\u0017\u0000\u0503"+ + "\u00a9\u0001\u0000\u0000\u0000\u0504\u0505\u0003\u0114\u0080\u0000\u0505"+ + "\u0506\u0001\u0000\u0000\u0000\u0506\u0507\u0006K\u001e\u0000\u0507\u00ab"+ + "\u0001\u0000\u0000\u0000\u0508\u0509\u0003\u0240\u0116\u0000\u0509\u050a"+ + "\u0001\u0000\u0000\u0000\u050a\u050b\u0006L\"\u0000\u050b\u00ad\u0001"+ + "\u0000\u0000\u0000\u050c\u050d\u0003\u0146\u0099\u0000\u050d\u050e\u0001"+ + "\u0000\u0000\u0000\u050e\u050f\u0006M\u001b\u0000\u050f\u00af\u0001\u0000"+ + "\u0000\u0000\u0510\u0511\u0003\u010e}\u0000\u0511\u0512\u0001\u0000\u0000"+ + "\u0000\u0512\u0513\u0006N#\u0000\u0513\u00b1\u0001\u0000\u0000\u0000\u0514"+ + "\u0515\u0003\u0136\u0091\u0000\u0515\u0516\u0001\u0000\u0000\u0000\u0516"+ + "\u0517\u0006O$\u0000\u0517\u00b3\u0001\u0000\u0000\u0000\u0518\u0519\u0003"+ + "\u0132\u008f\u0000\u0519\u051a\u0001\u0000\u0000\u0000\u051a\u051b\u0006"+ + "P%\u0000\u051b\u00b5\u0001\u0000\u0000\u0000\u051c\u051d\u0003\u0138\u0092"+ + "\u0000\u051d\u051e\u0001\u0000\u0000\u0000\u051e\u051f\u0006Q&\u0000\u051f"+ + "\u00b7\u0001\u0000\u0000\u0000\u0520\u0521\u0003\u0014\u0000\u0000\u0521"+ + "\u0522\u0001\u0000\u0000\u0000\u0522\u0523\u0006R\u0000\u0000\u0523\u00b9"+ + "\u0001\u0000\u0000\u0000\u0524\u0525\u0003\u0016\u0001\u0000\u0525\u0526"+ + "\u0001\u0000\u0000\u0000\u0526\u0527\u0006S\u0000\u0000\u0527\u00bb\u0001"+ + "\u0000\u0000\u0000\u0528\u0529\u0003\u0018\u0002\u0000\u0529\u052a\u0001"+ + "\u0000\u0000\u0000\u052a\u052b\u0006T\u0000\u0000\u052b\u00bd\u0001\u0000"+ + "\u0000\u0000\u052c\u052d\u0003\u013e\u0095\u0000\u052d\u052e\u0001\u0000"+ + "\u0000\u0000\u052e\u052f\u0006U\'\u0000\u052f\u0530\u0006U(\u0000\u0530"+ + "\u00bf\u0001\u0000\u0000\u0000\u0531\u0532\u0003\u00c8Z\u0000\u0532\u0533"+ + "\u0001\u0000\u0000\u0000\u0533\u0534\u0006V\u0012\u0000\u0534\u0535\u0006"+ + "V\u0013\u0000\u0535\u00c1\u0001\u0000\u0000\u0000\u0536\u0537\u0003\u0018"+ + "\u0002\u0000\u0537\u0538\u0001\u0000\u0000\u0000\u0538\u0539\u0006W\u0000"+ + "\u0000\u0539\u00c3\u0001\u0000\u0000\u0000\u053a\u053b\u0003\u0014\u0000"+ + "\u0000\u053b\u053c\u0001\u0000\u0000\u0000\u053c\u053d\u0006X\u0000\u0000"+ + "\u053d\u00c5\u0001\u0000\u0000\u0000\u053e\u053f\u0003\u0016\u0001\u0000"+ + "\u053f\u0540\u0001\u0000\u0000\u0000\u0540\u0541\u0006Y\u0000\u0000\u0541"+ + "\u00c7\u0001\u0000\u0000\u0000\u0542\u0543\u0005|\u0000\u0000\u0543\u0544"+ + "\u0001\u0000\u0000\u0000\u0544\u0545\u0006Z\u0013\u0000\u0545\u00c9\u0001"+ + "\u0000\u0000\u0000\u0546\u0547\u0007\u001a\u0000\u0000\u0547\u00cb\u0001"+ + "\u0000\u0000\u0000\u0548\u0549\u0007\u001b\u0000\u0000\u0549\u00cd\u0001"+ + "\u0000\u0000\u0000\u054a\u054b\u0005\\\u0000\u0000\u054b\u054c\u0007\u001c"+ + "\u0000\u0000\u054c\u00cf\u0001\u0000\u0000\u0000\u054d\u054e\b\u001d\u0000"+ + "\u0000\u054e\u00d1\u0001\u0000\u0000\u0000\u054f\u0551\u0007\u0007\u0000"+ + "\u0000\u0550\u0552\u0007\u001e\u0000\u0000\u0551\u0550\u0001\u0000\u0000"+ + "\u0000\u0551\u0552\u0001\u0000\u0000\u0000\u0552\u0554\u0001\u0000\u0000"+ + "\u0000\u0553\u0555\u0003\u00ca[\u0000\u0554\u0553\u0001\u0000\u0000\u0000"+ + "\u0555\u0556\u0001\u0000\u0000\u0000\u0556\u0554\u0001\u0000\u0000\u0000"+ + "\u0556\u0557\u0001\u0000\u0000\u0000\u0557\u00d3\u0001\u0000\u0000\u0000"+ + "\u0558\u0559\u0005@\u0000\u0000\u0559\u00d5\u0001\u0000\u0000\u0000\u055a"+ + "\u055b\u0005`\u0000\u0000\u055b\u00d7\u0001\u0000\u0000\u0000\u055c\u0560"+ + "\b\u001f\u0000\u0000\u055d\u055e\u0005`\u0000\u0000\u055e\u0560\u0005"+ + "`\u0000\u0000\u055f\u055c\u0001\u0000\u0000\u0000\u055f\u055d\u0001\u0000"+ + "\u0000\u0000\u0560\u00d9\u0001\u0000\u0000\u0000\u0561\u0562\u0005_\u0000"+ + "\u0000\u0562\u00db\u0001\u0000\u0000\u0000\u0563\u0567\u0003\u00cc\\\u0000"+ + "\u0564\u0567\u0003\u00ca[\u0000\u0565\u0567\u0003\u00dac\u0000\u0566\u0563"+ + "\u0001\u0000\u0000\u0000\u0566\u0564\u0001\u0000\u0000\u0000\u0566\u0565"+ + "\u0001\u0000\u0000\u0000\u0567\u00dd\u0001\u0000\u0000\u0000\u0568\u056d"+ + "\u0005\"\u0000\u0000\u0569\u056c\u0003\u00ce]\u0000\u056a\u056c\u0003"+ + "\u00d0^\u0000\u056b\u0569\u0001\u0000\u0000\u0000\u056b\u056a\u0001\u0000"+ + "\u0000\u0000\u056c\u056f\u0001\u0000\u0000\u0000\u056d\u056b\u0001\u0000"+ + "\u0000\u0000\u056d\u056e\u0001\u0000\u0000\u0000\u056e\u0570\u0001\u0000"+ + "\u0000\u0000\u056f\u056d\u0001\u0000\u0000\u0000\u0570\u0586\u0005\"\u0000"+ + "\u0000\u0571\u0572\u0005\"\u0000\u0000\u0572\u0573\u0005\"\u0000\u0000"+ + "\u0573\u0574\u0005\"\u0000\u0000\u0574\u0578\u0001\u0000\u0000\u0000\u0575"+ + "\u0577\b\u0000\u0000\u0000\u0576\u0575\u0001\u0000\u0000\u0000\u0577\u057a"+ + "\u0001\u0000\u0000\u0000\u0578\u0579\u0001\u0000\u0000\u0000\u0578\u0576"+ + "\u0001\u0000\u0000\u0000\u0579\u057b\u0001\u0000\u0000\u0000\u057a\u0578"+ + "\u0001\u0000\u0000\u0000\u057b\u057c\u0005\"\u0000\u0000\u057c\u057d\u0005"+ + "\"\u0000\u0000\u057d\u057e\u0005\"\u0000\u0000\u057e\u0580\u0001\u0000"+ + "\u0000\u0000\u057f\u0581\u0005\"\u0000\u0000\u0580\u057f\u0001\u0000\u0000"+ + "\u0000\u0580\u0581\u0001\u0000\u0000\u0000\u0581\u0583\u0001\u0000\u0000"+ + "\u0000\u0582\u0584\u0005\"\u0000\u0000\u0583\u0582\u0001\u0000\u0000\u0000"+ + "\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0586\u0001\u0000\u0000\u0000"+ + "\u0585\u0568\u0001\u0000\u0000\u0000\u0585\u0571\u0001\u0000\u0000\u0000"+ + "\u0586\u00df\u0001\u0000\u0000\u0000\u0587\u0589\u0003\u00ca[\u0000\u0588"+ + "\u0587\u0001\u0000\u0000\u0000\u0589\u058a\u0001\u0000\u0000\u0000\u058a"+ + "\u0588\u0001\u0000\u0000\u0000\u058a\u058b\u0001\u0000\u0000\u0000\u058b"+ + "\u00e1\u0001\u0000\u0000\u0000\u058c\u058e\u0003\u00ca[\u0000\u058d\u058c"+ + "\u0001\u0000\u0000\u0000\u058e\u058f\u0001\u0000\u0000\u0000\u058f\u058d"+ + "\u0001\u0000\u0000\u0000\u058f\u0590\u0001\u0000\u0000\u0000\u0590\u0591"+ + "\u0001\u0000\u0000\u0000\u0591\u0595\u0003\u00f6q\u0000\u0592\u0594\u0003"+ + "\u00ca[\u0000\u0593\u0592\u0001\u0000\u0000\u0000\u0594\u0597\u0001\u0000"+ + "\u0000\u0000\u0595\u0593\u0001\u0000\u0000\u0000\u0595\u0596\u0001\u0000"+ + "\u0000\u0000\u0596\u05b7\u0001\u0000\u0000\u0000\u0597\u0595\u0001\u0000"+ + "\u0000\u0000\u0598\u059a\u0003\u00f6q\u0000\u0599\u059b\u0003\u00ca[\u0000"+ + "\u059a\u0599\u0001\u0000\u0000\u0000\u059b\u059c\u0001\u0000\u0000\u0000"+ + "\u059c\u059a\u0001\u0000\u0000\u0000\u059c\u059d\u0001\u0000\u0000\u0000"+ + "\u059d\u05b7\u0001\u0000\u0000\u0000\u059e\u05a0\u0003\u00ca[\u0000\u059f"+ + "\u059e\u0001\u0000\u0000\u0000\u05a0\u05a1\u0001\u0000\u0000\u0000\u05a1"+ + "\u059f\u0001\u0000\u0000\u0000\u05a1\u05a2\u0001\u0000\u0000\u0000\u05a2"+ + "\u05aa\u0001\u0000\u0000\u0000\u05a3\u05a7\u0003\u00f6q\u0000\u05a4\u05a6"+ + "\u0003\u00ca[\u0000\u05a5\u05a4\u0001\u0000\u0000\u0000\u05a6\u05a9\u0001"+ + "\u0000\u0000\u0000\u05a7\u05a5\u0001\u0000\u0000\u0000\u05a7\u05a8\u0001"+ + "\u0000\u0000\u0000\u05a8\u05ab\u0001\u0000\u0000\u0000\u05a9\u05a7\u0001"+ + "\u0000\u0000\u0000\u05aa\u05a3\u0001\u0000\u0000\u0000\u05aa\u05ab\u0001"+ + "\u0000\u0000\u0000\u05ab\u05ac\u0001\u0000\u0000\u0000\u05ac\u05ad\u0003"+ + "\u00d2_\u0000\u05ad\u05b7\u0001\u0000\u0000\u0000\u05ae\u05b0\u0003\u00f6"+ + "q\u0000\u05af\u05b1\u0003\u00ca[\u0000\u05b0\u05af\u0001\u0000\u0000\u0000"+ + "\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u05b0\u0001\u0000\u0000\u0000"+ + "\u05b2\u05b3\u0001\u0000\u0000\u0000\u05b3\u05b4\u0001\u0000\u0000\u0000"+ + "\u05b4\u05b5\u0003\u00d2_\u0000\u05b5\u05b7\u0001\u0000\u0000\u0000\u05b6"+ + "\u058d\u0001\u0000\u0000\u0000\u05b6\u0598\u0001\u0000\u0000\u0000\u05b6"+ + "\u059f\u0001\u0000\u0000\u0000\u05b6\u05ae\u0001\u0000\u0000\u0000\u05b7"+ + "\u00e3\u0001\u0000\u0000\u0000\u05b8\u05b9\u0007\u0004\u0000\u0000\u05b9"+ + "\u05ba\u0007\u0005\u0000\u0000\u05ba\u05bb\u0007\u0010\u0000\u0000\u05bb"+ + "\u00e5\u0001\u0000\u0000\u0000\u05bc\u05bd\u0007\u0004\u0000\u0000\u05bd"+ + "\u05be\u0007\u0011\u0000\u0000\u05be\u05bf\u0007\u0002\u0000\u0000\u05bf"+ + "\u00e7\u0001\u0000\u0000\u0000\u05c0\u05c1\u0005=\u0000\u0000\u05c1\u00e9"+ + "\u0001\u0000\u0000\u0000\u05c2\u05c3\u0007 \u0000\u0000\u05c3\u05c4\u0007"+ + "!\u0000\u0000\u05c4\u00eb\u0001\u0000\u0000\u0000\u05c5\u05c6\u0005:\u0000"+ + "\u0000\u05c6\u05c7\u0005:\u0000\u0000\u05c7\u00ed\u0001\u0000\u0000\u0000"+ + "\u05c8\u05c9\u0005:\u0000\u0000\u05c9\u00ef\u0001\u0000\u0000\u0000\u05ca"+ + "\u05cb\u0005;\u0000\u0000\u05cb\u00f1\u0001\u0000\u0000\u0000\u05cc\u05cd"+ + "\u0005,\u0000\u0000\u05cd\u00f3\u0001\u0000\u0000\u0000\u05ce\u05cf\u0007"+ + "\u0010\u0000\u0000\u05cf\u05d0\u0007\u0007\u0000\u0000\u05d0\u05d1\u0007"+ + "\u0011\u0000\u0000\u05d1\u05d2\u0007\u0002\u0000\u0000\u05d2\u00f5\u0001"+ + "\u0000\u0000\u0000\u05d3\u05d4\u0005.\u0000\u0000\u05d4\u00f7\u0001\u0000"+ + "\u0000\u0000\u05d5\u05d6\u0007\u0016\u0000\u0000\u05d6\u05d7\u0007\u0004"+ + "\u0000\u0000\u05d7\u05d8\u0007\u000e\u0000\u0000\u05d8\u05d9\u0007\u0011"+ + "\u0000\u0000\u05d9\u05da\u0007\u0007\u0000\u0000\u05da\u00f9\u0001\u0000"+ + "\u0000\u0000\u05db\u05dc\u0007\u0016\u0000\u0000\u05dc\u05dd\u0007\n\u0000"+ + "\u0000\u05dd\u05de\u0007\f\u0000\u0000\u05de\u05df\u0007\u0011\u0000\u0000"+ + "\u05df\u05e0\u0007\u000b\u0000\u0000\u05e0\u00fb\u0001\u0000\u0000\u0000"+ + "\u05e1\u05e2\u0007\n\u0000\u0000\u05e2\u05e3\u0007\u0005\u0000\u0000\u05e3"+ + "\u00fd\u0001\u0000\u0000\u0000\u05e4\u05e5\u0007\n\u0000\u0000\u05e5\u05e6"+ + "\u0007\u0011\u0000\u0000\u05e6\u00ff\u0001\u0000\u0000\u0000\u05e7\u05e8"+ + "\u0007\u000e\u0000\u0000\u05e8\u05e9\u0007\u0004\u0000\u0000\u05e9\u05ea"+ + "\u0007\u0011\u0000\u0000\u05ea\u05eb\u0007\u000b\u0000\u0000\u05eb\u0101"+ + "\u0001\u0000\u0000\u0000\u05ec\u05ed\u0007\u000e\u0000\u0000\u05ed\u05ee"+ + "\u0007\n\u0000\u0000\u05ee\u05ef\u0007\u0013\u0000\u0000\u05ef\u05f0\u0007"+ + "\u0007\u0000\u0000\u05f0\u0103\u0001\u0000\u0000\u0000\u05f1\u05f2\u0007"+ + "\u0005\u0000\u0000\u05f2\u05f3\u0007\t\u0000\u0000\u05f3\u05f4\u0007\u000b"+ + "\u0000\u0000\u05f4\u0105\u0001\u0000\u0000\u0000\u05f5\u05f6\u0007\u0005"+ + "\u0000\u0000\u05f6\u05f7\u0007\u0015\u0000\u0000\u05f7\u05f8\u0007\u000e"+ + "\u0000\u0000\u05f8\u05f9\u0007\u000e\u0000\u0000\u05f9\u0107\u0001\u0000"+ + "\u0000\u0000\u05fa\u05fb\u0007\u0005\u0000\u0000\u05fb\u05fc\u0007\u0015"+ + "\u0000\u0000\u05fc\u05fd\u0007\u000e\u0000\u0000\u05fd\u05fe\u0007\u000e"+ + "\u0000\u0000\u05fe\u05ff\u0007\u0011\u0000\u0000\u05ff\u0109\u0001\u0000"+ + "\u0000\u0000\u0600\u0601\u0007\t\u0000\u0000\u0601\u0602\u0007\u0005\u0000"+ + "\u0000\u0602\u010b\u0001\u0000\u0000\u0000\u0603\u0604\u0007\t\u0000\u0000"+ + "\u0604\u0605\u0007\f\u0000\u0000\u0605\u010d\u0001\u0000\u0000\u0000\u0606"+ + "\u0607\u0005?\u0000\u0000\u0607\u010f\u0001\u0000\u0000\u0000\u0608\u0609"+ + "\u0007\f\u0000\u0000\u0609\u060a\u0007\u000e\u0000\u0000\u060a\u060b\u0007"+ + "\n\u0000\u0000\u060b\u060c\u0007\u0013\u0000\u0000\u060c\u060d\u0007\u0007"+ + "\u0000\u0000\u060d\u0111\u0001\u0000\u0000\u0000\u060e\u060f\u0007\u000b"+ + "\u0000\u0000\u060f\u0610\u0007\f\u0000\u0000\u0610\u0611\u0007\u0015\u0000"+ + "\u0000\u0611\u0612\u0007\u0007\u0000\u0000\u0612\u0113\u0001\u0000\u0000"+ + "\u0000\u0613\u0614\u0007\u0014\u0000\u0000\u0614\u0615\u0007\n\u0000\u0000"+ + "\u0615\u0616\u0007\u000b\u0000\u0000\u0616\u0617\u0007\u0003\u0000\u0000"+ + "\u0617\u0115\u0001\u0000\u0000\u0000\u0618\u0619\u0005=\u0000\u0000\u0619"+ + "\u061a\u0005=\u0000\u0000\u061a\u0117\u0001\u0000\u0000\u0000\u061b\u061c"+ + "\u0005=\u0000\u0000\u061c\u061d\u0005~\u0000\u0000\u061d\u0119\u0001\u0000"+ + "\u0000\u0000\u061e\u061f\u0005!\u0000\u0000\u061f\u0620\u0005=\u0000\u0000"+ + "\u0620\u011b\u0001\u0000\u0000\u0000\u0621\u0622\u0005<\u0000\u0000\u0622"+ + "\u011d\u0001\u0000\u0000\u0000\u0623\u0624\u0005<\u0000\u0000\u0624\u0625"+ + "\u0005=\u0000\u0000\u0625\u011f\u0001\u0000\u0000\u0000\u0626\u0627\u0005"+ + ">\u0000\u0000\u0627\u0121\u0001\u0000\u0000\u0000\u0628\u0629\u0005>\u0000"+ + "\u0000\u0629\u062a\u0005=\u0000\u0000\u062a\u0123\u0001\u0000\u0000\u0000"+ + "\u062b\u062c\u0005+\u0000\u0000\u062c\u0125\u0001\u0000\u0000\u0000\u062d"+ + "\u062e\u0005-\u0000\u0000\u062e\u0127\u0001\u0000\u0000\u0000\u062f\u0630"+ + "\u0005*\u0000\u0000\u0630\u0129\u0001\u0000\u0000\u0000\u0631\u0632\u0005"+ + "/\u0000\u0000\u0632\u012b\u0001\u0000\u0000\u0000\u0633\u0634\u0005%\u0000"+ + "\u0000\u0634\u012d\u0001\u0000\u0000\u0000\u0635\u0636\u0005{\u0000\u0000"+ + "\u0636\u012f\u0001\u0000\u0000\u0000\u0637\u0638\u0005}\u0000\u0000\u0638"+ + "\u0131\u0001\u0000\u0000\u0000\u0639\u063a\u0005?\u0000\u0000\u063a\u063b"+ + "\u0005?\u0000\u0000\u063b\u0133\u0001\u0000\u0000\u0000\u063c\u063d\u0003"+ + "4\u0010\u0000\u063d\u063e\u0001\u0000\u0000\u0000\u063e\u063f\u0006\u0090"+ + ")\u0000\u063f\u0135\u0001\u0000\u0000\u0000\u0640\u0643\u0003\u010e}\u0000"+ + "\u0641\u0644\u0003\u00cc\\\u0000\u0642\u0644\u0003\u00dac\u0000\u0643"+ + "\u0641\u0001\u0000\u0000\u0000\u0643\u0642\u0001\u0000\u0000\u0000\u0644"+ + "\u0648\u0001\u0000\u0000\u0000\u0645\u0647\u0003\u00dcd\u0000\u0646\u0645"+ + "\u0001\u0000\u0000\u0000\u0647\u064a\u0001\u0000\u0000\u0000\u0648\u0646"+ + "\u0001\u0000\u0000\u0000\u0648\u0649\u0001\u0000\u0000\u0000\u0649\u0652"+ + "\u0001\u0000\u0000\u0000\u064a\u0648\u0001\u0000\u0000\u0000\u064b\u064d"+ + "\u0003\u010e}\u0000\u064c\u064e\u0003\u00ca[\u0000\u064d\u064c\u0001\u0000"+ + "\u0000\u0000\u064e\u064f\u0001\u0000\u0000\u0000\u064f\u064d\u0001\u0000"+ + "\u0000\u0000\u064f\u0650\u0001\u0000\u0000\u0000\u0650\u0652\u0001\u0000"+ + "\u0000\u0000\u0651\u0640\u0001\u0000\u0000\u0000\u0651\u064b\u0001\u0000"+ + "\u0000\u0000\u0652\u0137\u0001\u0000\u0000\u0000\u0653\u0656\u0003\u0132"+ + "\u008f\u0000\u0654\u0657\u0003\u00cc\\\u0000\u0655\u0657\u0003\u00dac"+ + "\u0000\u0656\u0654\u0001\u0000\u0000\u0000\u0656\u0655\u0001\u0000\u0000"+ + "\u0000\u0657\u065b\u0001\u0000\u0000\u0000\u0658\u065a\u0003\u00dcd\u0000"+ + "\u0659\u0658\u0001\u0000\u0000\u0000\u065a\u065d\u0001\u0000\u0000\u0000"+ + "\u065b\u0659\u0001\u0000\u0000\u0000\u065b\u065c\u0001\u0000\u0000\u0000"+ + "\u065c\u0665\u0001\u0000\u0000\u0000\u065d\u065b\u0001\u0000\u0000\u0000"+ + "\u065e\u0660\u0003\u0132\u008f\u0000\u065f\u0661\u0003\u00ca[\u0000\u0660"+ + "\u065f\u0001\u0000\u0000\u0000\u0661\u0662\u0001\u0000\u0000\u0000\u0662"+ + "\u0660\u0001\u0000\u0000\u0000\u0662\u0663\u0001\u0000\u0000\u0000\u0663"+ + "\u0665\u0001\u0000\u0000\u0000\u0664\u0653\u0001\u0000\u0000\u0000\u0664"+ + "\u065e\u0001\u0000\u0000\u0000\u0665\u0139\u0001\u0000\u0000\u0000\u0666"+ + "\u0667\u0005[\u0000\u0000\u0667\u0668\u0001\u0000\u0000\u0000\u0668\u0669"+ + "\u0006\u0093\u0004\u0000\u0669\u066a\u0006\u0093\u0004\u0000\u066a\u013b"+ + "\u0001\u0000\u0000\u0000\u066b\u066c\u0005]\u0000\u0000\u066c\u066d\u0001"+ + "\u0000\u0000\u0000\u066d\u066e\u0006\u0094\u0013\u0000\u066e\u066f\u0006"+ + "\u0094\u0013\u0000\u066f\u013d\u0001\u0000\u0000\u0000\u0670\u0671\u0005"+ + "(\u0000\u0000\u0671\u0672\u0001\u0000\u0000\u0000\u0672\u0673\u0006\u0095"+ + "\u0004\u0000\u0673\u0674\u0006\u0095\u0004\u0000\u0674\u013f\u0001\u0000"+ + "\u0000\u0000\u0675\u0676\u0005)\u0000\u0000\u0676\u0677\u0001\u0000\u0000"+ + "\u0000\u0677\u0678\u0006\u0096\u0013\u0000\u0678\u0679\u0006\u0096\u0013"+ + "\u0000\u0679\u0141\u0001\u0000\u0000\u0000\u067a\u067e\u0003\u00cc\\\u0000"+ + "\u067b\u067d\u0003\u00dcd\u0000\u067c\u067b\u0001\u0000\u0000\u0000\u067d"+ + "\u0680\u0001\u0000\u0000\u0000\u067e\u067c\u0001\u0000\u0000\u0000\u067e"+ + "\u067f\u0001\u0000\u0000\u0000\u067f\u068b\u0001\u0000\u0000\u0000\u0680"+ + "\u067e\u0001\u0000\u0000\u0000\u0681\u0684\u0003\u00dac\u0000\u0682\u0684"+ + "\u0003\u00d4`\u0000\u0683\u0681\u0001\u0000\u0000\u0000\u0683\u0682\u0001"+ + "\u0000\u0000\u0000\u0684\u0686\u0001\u0000\u0000\u0000\u0685\u0687\u0003"+ + "\u00dcd\u0000\u0686\u0685\u0001\u0000\u0000\u0000\u0687\u0688\u0001\u0000"+ + "\u0000\u0000\u0688\u0686\u0001\u0000\u0000\u0000\u0688\u0689\u0001\u0000"+ + "\u0000\u0000\u0689\u068b\u0001\u0000\u0000\u0000\u068a\u067a\u0001\u0000"+ + "\u0000\u0000\u068a\u0683\u0001\u0000\u0000\u0000\u068b\u0143\u0001\u0000"+ + "\u0000\u0000\u068c\u068e\u0003\u00d6a\u0000\u068d\u068f\u0003\u00d8b\u0000"+ + "\u068e\u068d\u0001\u0000\u0000\u0000\u068f\u0690\u0001\u0000\u0000\u0000"+ + "\u0690\u068e\u0001\u0000\u0000\u0000\u0690\u0691\u0001\u0000\u0000\u0000"+ + "\u0691\u0692\u0001\u0000\u0000\u0000\u0692\u0693\u0003\u00d6a\u0000\u0693"+ + "\u0145\u0001\u0000\u0000\u0000\u0694\u0695\u0003\u0144\u0098\u0000\u0695"+ + "\u0147\u0001\u0000\u0000\u0000\u0696\u0697\u0003\u0014\u0000\u0000\u0697"+ + "\u0698\u0001\u0000\u0000\u0000\u0698\u0699\u0006\u009a\u0000\u0000\u0699"+ + "\u0149\u0001\u0000\u0000\u0000\u069a\u069b\u0003\u0016\u0001\u0000\u069b"+ + "\u069c\u0001\u0000\u0000\u0000\u069c\u069d\u0006\u009b\u0000\u0000\u069d"+ + "\u014b\u0001\u0000\u0000\u0000\u069e\u069f\u0003\u0018\u0002\u0000\u069f"+ + "\u06a0\u0001\u0000\u0000\u0000\u06a0\u06a1\u0006\u009c\u0000\u0000\u06a1"+ + "\u014d\u0001\u0000\u0000\u0000\u06a2\u06a3\u0003\u00c8Z\u0000\u06a3\u06a4"+ + "\u0001\u0000\u0000\u0000\u06a4\u06a5\u0006\u009d\u0012\u0000\u06a5\u06a6"+ + "\u0006\u009d\u0013\u0000\u06a6\u014f\u0001\u0000\u0000\u0000\u06a7\u06a8"+ + "\u0003\u00eem\u0000\u06a8\u06a9\u0001\u0000\u0000\u0000\u06a9\u06aa\u0006"+ + "\u009e*\u0000\u06aa\u0151\u0001\u0000\u0000\u0000\u06ab\u06ac\u0003\u00ec"+ + "l\u0000\u06ac\u06ad\u0001\u0000\u0000\u0000\u06ad\u06ae\u0006\u009f+\u0000"+ + "\u06ae\u0153\u0001\u0000\u0000\u0000\u06af\u06b0\u0003\u00f2o\u0000\u06b0"+ + "\u06b1\u0001\u0000\u0000\u0000\u06b1\u06b2\u0006\u00a0\u0018\u0000\u06b2"+ + "\u0155\u0001\u0000\u0000\u0000\u06b3\u06b4\u0003\u00e8j\u0000\u06b4\u06b5"+ + "\u0001\u0000\u0000\u0000\u06b5\u06b6\u0006\u00a1!\u0000\u06b6\u0157\u0001"+ + "\u0000\u0000\u0000\u06b7\u06b8\u0007\u000f\u0000\u0000\u06b8\u06b9\u0007"+ + "\u0007\u0000\u0000\u06b9\u06ba\u0007\u000b\u0000\u0000\u06ba\u06bb\u0007"+ + "\u0004\u0000\u0000\u06bb\u06bc\u0007\u0010\u0000\u0000\u06bc\u06bd\u0007"+ + "\u0004\u0000\u0000\u06bd\u06be\u0007\u000b\u0000\u0000\u06be\u06bf\u0007"+ + "\u0004\u0000\u0000\u06bf\u0159\u0001\u0000\u0000\u0000\u06c0\u06c1\u0003"+ + "\u0114\u0080\u0000\u06c1\u06c2\u0001\u0000\u0000\u0000\u06c2\u06c3\u0006"+ + "\u00a3\u001e\u0000\u06c3\u06c4\u0006\u00a3\u0013\u0000\u06c4\u06c5\u0006"+ + "\u00a3\u0004\u0000\u06c5\u015b\u0001\u0000\u0000\u0000\u06c6\u06c7\u0003"+ + "\u010e}\u0000\u06c7\u06c8\u0001\u0000\u0000\u0000\u06c8\u06c9\u0006\u00a4"+ + "#\u0000\u06c9\u015d\u0001\u0000\u0000\u0000\u06ca\u06cb\u0003\u0136\u0091"+ + "\u0000\u06cb\u06cc\u0001\u0000\u0000\u0000\u06cc\u06cd\u0006\u00a5$\u0000"+ + "\u06cd\u015f\u0001\u0000\u0000\u0000\u06ce\u06cf\u0003\u0140\u0096\u0000"+ + "\u06cf\u06d0\u0001\u0000\u0000\u0000\u06d0\u06d1\u0006\u00a6\u0014\u0000"+ + "\u06d1\u06d2\u0006\u00a6\u0013\u0000\u06d2\u06d3\u0006\u00a6\u0013\u0000"+ + "\u06d3\u0161\u0001\u0000\u0000\u0000\u06d4\u06d5\u0003\u013e\u0095\u0000"+ + "\u06d5\u06d6\u0001\u0000\u0000\u0000\u06d6\u06d7\u0006\u00a7\'\u0000\u06d7"+ + "\u06d8\u0006\u00a7(\u0000\u06d8\u0163\u0001\u0000\u0000\u0000\u06d9\u06dd"+ + "\b\"\u0000\u0000\u06da\u06db\u0005/\u0000\u0000\u06db\u06dd\b#\u0000\u0000"+ + "\u06dc\u06d9\u0001\u0000\u0000\u0000\u06dc\u06da\u0001\u0000\u0000\u0000"+ + "\u06dd\u0165\u0001\u0000\u0000\u0000\u06de\u06e0\u0003\u0164\u00a8\u0000"+ + "\u06df\u06de\u0001\u0000\u0000\u0000\u06e0\u06e1\u0001\u0000\u0000\u0000"+ + "\u06e1\u06df\u0001\u0000\u0000\u0000\u06e1\u06e2\u0001\u0000\u0000\u0000"+ + "\u06e2\u0167\u0001\u0000\u0000\u0000\u06e3\u06e4\u0003\u0166\u00a9\u0000"+ + "\u06e4\u06e5\u0001\u0000\u0000\u0000\u06e5\u06e6\u0006\u00aa,\u0000\u06e6"+ + "\u0169\u0001\u0000\u0000\u0000\u06e7\u06e8\u0003\u00dee\u0000\u06e8\u06e9"+ + "\u0001\u0000\u0000\u0000\u06e9\u06ea\u0006\u00ab \u0000\u06ea\u016b\u0001"+ + "\u0000\u0000\u0000\u06eb\u06ec\u0003\u0014\u0000\u0000\u06ec\u06ed\u0001"+ + "\u0000\u0000\u0000\u06ed\u06ee\u0006\u00ac\u0000\u0000\u06ee\u016d\u0001"+ + "\u0000\u0000\u0000\u06ef\u06f0\u0003\u0016\u0001\u0000\u06f0\u06f1\u0001"+ + "\u0000\u0000\u0000\u06f1\u06f2\u0006\u00ad\u0000\u0000\u06f2\u016f\u0001"+ + "\u0000\u0000\u0000\u06f3\u06f4\u0003\u0018\u0002\u0000\u06f4\u06f5\u0001"+ + "\u0000\u0000\u0000\u06f5\u06f6\u0006\u00ae\u0000\u0000\u06f6\u0171\u0001"+ + "\u0000\u0000\u0000\u06f7\u06f8\u0003\u013e\u0095\u0000\u06f8\u06f9\u0001"+ + "\u0000\u0000\u0000\u06f9\u06fa\u0006\u00af\'\u0000\u06fa\u06fb\u0006\u00af"+ + "(\u0000\u06fb\u0173\u0001\u0000\u0000\u0000\u06fc\u06fd\u0003\u0140\u0096"+ + "\u0000\u06fd\u06fe\u0001\u0000\u0000\u0000\u06fe\u06ff\u0006\u00b0\u0014"+ + "\u0000\u06ff\u0700\u0006\u00b0\u0013\u0000\u0700\u0701\u0006\u00b0\u0013"+ + "\u0000\u0701\u0175\u0001\u0000\u0000\u0000\u0702\u0703\u0003\u00c8Z\u0000"+ + "\u0703\u0704\u0001\u0000\u0000\u0000\u0704\u0705\u0006\u00b1\u0012\u0000"+ + "\u0705\u0706\u0006\u00b1\u0013\u0000\u0706\u0177\u0001\u0000\u0000\u0000"+ + "\u0707\u0708\u0003\u0018\u0002\u0000\u0708\u0709\u0001\u0000\u0000\u0000"+ + "\u0709\u070a\u0006\u00b2\u0000\u0000\u070a\u0179\u0001\u0000\u0000\u0000"+ + "\u070b\u070c\u0003\u0014\u0000\u0000\u070c\u070d\u0001\u0000\u0000\u0000"+ + "\u070d\u070e\u0006\u00b3\u0000\u0000\u070e\u017b\u0001\u0000\u0000\u0000"+ + "\u070f\u0710\u0003\u0016\u0001\u0000\u0710\u0711\u0001\u0000\u0000\u0000"+ + "\u0711\u0712\u0006\u00b4\u0000\u0000\u0712\u017d\u0001\u0000\u0000\u0000"+ + "\u0713\u0714\u0003\u00c8Z\u0000\u0714\u0715\u0001\u0000\u0000\u0000\u0715"+ + "\u0716\u0006\u00b5\u0012\u0000\u0716\u0717\u0006\u00b5\u0013\u0000\u0717"+ + "\u017f\u0001\u0000\u0000\u0000\u0718\u0719\u0003\u0140\u0096\u0000\u0719"+ + "\u071a\u0001\u0000\u0000\u0000\u071a\u071b\u0006\u00b6\u0014\u0000\u071b"+ + "\u071c\u0006\u00b6\u0013\u0000\u071c\u071d\u0006\u00b6\u0013\u0000\u071d"+ + "\u0181\u0001\u0000\u0000\u0000\u071e\u071f\u0007\u0006\u0000\u0000\u071f"+ + "\u0720\u0007\f\u0000\u0000\u0720\u0721\u0007\t\u0000\u0000\u0721\u0722"+ + "\u0007\u0015\u0000\u0000\u0722\u0723\u0007\b\u0000\u0000\u0723\u0183\u0001"+ + "\u0000\u0000\u0000\u0724\u0725\u0007\u0011\u0000\u0000\u0725\u0726\u0007"+ + "\u0002\u0000\u0000\u0726\u0727\u0007\t\u0000\u0000\u0727\u0728\u0007\f"+ + "\u0000\u0000\u0728\u0729\u0007\u0007\u0000\u0000\u0729\u0185\u0001\u0000"+ + "\u0000\u0000\u072a\u072b\u0007\u0013\u0000\u0000\u072b\u072c\u0007\u0007"+ + "\u0000\u0000\u072c\u072d\u0007!\u0000\u0000\u072d\u0187\u0001\u0000\u0000"+ + "\u0000\u072e\u072f\u0003\u0114\u0080\u0000\u072f\u0730\u0001\u0000\u0000"+ + "\u0000\u0730\u0731\u0006\u00ba\u001e\u0000\u0731\u0732\u0006\u00ba\u0013"+ + "\u0000\u0732\u0733\u0006\u00ba\u0004\u0000\u0733\u0189\u0001\u0000\u0000"+ + "\u0000\u0734\u0735\u0003\u00f2o\u0000\u0735\u0736\u0001\u0000\u0000\u0000"+ + "\u0736\u0737\u0006\u00bb\u0018\u0000\u0737\u018b\u0001\u0000\u0000\u0000"+ + "\u0738\u0739\u0003\u00f6q\u0000\u0739\u073a\u0001\u0000\u0000\u0000\u073a"+ + "\u073b\u0006\u00bc\u0017\u0000\u073b\u018d\u0001\u0000\u0000\u0000\u073c"+ + "\u073d\u0003\u010e}\u0000\u073d\u073e\u0001\u0000\u0000\u0000\u073e\u073f"+ + "\u0006\u00bd#\u0000\u073f\u018f\u0001\u0000\u0000\u0000\u0740\u0741\u0003"+ + "\u0136\u0091\u0000\u0741\u0742\u0001\u0000\u0000\u0000\u0742\u0743\u0006"+ + "\u00be$\u0000\u0743\u0191\u0001\u0000\u0000\u0000\u0744\u0745\u0003\u0132"+ + "\u008f\u0000\u0745\u0746\u0001\u0000\u0000\u0000\u0746\u0747\u0006\u00bf"+ + "%\u0000\u0747\u0193\u0001\u0000\u0000\u0000\u0748\u0749\u0003\u0138\u0092"+ + "\u0000\u0749\u074a\u0001\u0000\u0000\u0000\u074a\u074b\u0006\u00c0&\u0000"+ + "\u074b\u0195\u0001\u0000\u0000\u0000\u074c\u074d\u0003\u00eak\u0000\u074d"+ + "\u074e\u0001\u0000\u0000\u0000\u074e\u074f\u0006\u00c1-\u0000\u074f\u0197"+ + "\u0001\u0000\u0000\u0000\u0750\u0751\u0003\u0146\u0099\u0000\u0751\u0752"+ + "\u0001\u0000\u0000\u0000\u0752\u0753\u0006\u00c2\u001b\u0000\u0753\u0199"+ + "\u0001\u0000\u0000\u0000\u0754\u0755\u0003\u0142\u0097\u0000\u0755\u0756"+ + "\u0001\u0000\u0000\u0000\u0756\u0757\u0006\u00c3\u001c\u0000\u0757\u019b"+ + "\u0001\u0000\u0000\u0000\u0758\u0759\u0003\u0014\u0000\u0000\u0759\u075a"+ + "\u0001\u0000\u0000\u0000\u075a\u075b\u0006\u00c4\u0000\u0000\u075b\u019d"+ + "\u0001\u0000\u0000\u0000\u075c\u075d\u0003\u0016\u0001\u0000\u075d\u075e"+ + "\u0001\u0000\u0000\u0000\u075e\u075f\u0006\u00c5\u0000\u0000\u075f\u019f"+ + "\u0001\u0000\u0000\u0000\u0760\u0761\u0003\u0018\u0002\u0000\u0761\u0762"+ + "\u0001\u0000\u0000\u0000\u0762\u0763\u0006\u00c6\u0000\u0000\u0763\u01a1"+ + "\u0001\u0000\u0000\u0000\u0764\u0765\u0007\u0011\u0000\u0000\u0765\u0766"+ + "\u0007\u000b\u0000\u0000\u0766\u0767\u0007\u0004\u0000\u0000\u0767\u0768"+ + "\u0007\u000b\u0000\u0000\u0768\u0769\u0007\u0011\u0000\u0000\u0769\u076a"+ + "\u0001\u0000\u0000\u0000\u076a\u076b\u0006\u00c7\u0013\u0000\u076b\u076c"+ + "\u0006\u00c7\u0004\u0000\u076c\u01a3\u0001\u0000\u0000\u0000\u076d\u076e"+ + "\u0003\u0014\u0000\u0000\u076e\u076f\u0001\u0000\u0000\u0000\u076f\u0770"+ + "\u0006\u00c8\u0000\u0000\u0770\u01a5\u0001\u0000\u0000\u0000\u0771\u0772"+ + "\u0003\u0016\u0001\u0000\u0772\u0773\u0001\u0000\u0000\u0000\u0773\u0774"+ + "\u0006\u00c9\u0000\u0000\u0774\u01a7\u0001\u0000\u0000\u0000\u0775\u0776"+ + "\u0003\u0018\u0002\u0000\u0776\u0777\u0001\u0000\u0000\u0000\u0777\u0778"+ + "\u0006\u00ca\u0000\u0000\u0778\u01a9\u0001\u0000\u0000\u0000\u0779\u077a"+ + "\u0003\u00c8Z\u0000\u077a\u077b\u0001\u0000\u0000\u0000\u077b\u077c\u0006"+ + "\u00cb\u0012\u0000\u077c\u077d\u0006\u00cb\u0013\u0000\u077d\u01ab\u0001"+ + "\u0000\u0000\u0000\u077e\u077f\u0007$\u0000\u0000\u077f\u0780\u0007\t"+ + "\u0000\u0000\u0780\u0781\u0007\n\u0000\u0000\u0781\u0782\u0007\u0005\u0000"+ + "\u0000\u0782\u01ad\u0001\u0000\u0000\u0000\u0783\u0784\u0003\u0284\u0138"+ + "\u0000\u0784\u0785\u0001\u0000\u0000\u0000\u0785\u0786\u0006\u00cd\u0016"+ + "\u0000\u0786\u01af\u0001\u0000\u0000\u0000\u0787\u0788\u0003\u010a{\u0000"+ + "\u0788\u0789\u0001\u0000\u0000\u0000\u0789\u078a\u0006\u00ce\u0015\u0000"+ + "\u078a\u078b\u0006\u00ce\u0013\u0000\u078b\u078c\u0006\u00ce\u0004\u0000"+ + "\u078c\u01b1\u0001\u0000\u0000\u0000\u078d\u078e\u0007\u0015\u0000\u0000"+ + "\u078e\u078f\u0007\u0011\u0000\u0000\u078f\u0790\u0007\n\u0000\u0000\u0790"+ + "\u0791\u0007\u0005\u0000\u0000\u0791\u0792\u0007\u0006\u0000\u0000\u0792"+ + "\u0793\u0001\u0000\u0000\u0000\u0793\u0794\u0006\u00cf\u0013\u0000\u0794"+ + "\u0795\u0006\u00cf\u0004\u0000\u0795\u01b3\u0001\u0000\u0000\u0000\u0796"+ + "\u0797\u0003\u0166\u00a9\u0000\u0797\u0798\u0001\u0000\u0000\u0000\u0798"+ + "\u0799\u0006\u00d0,\u0000\u0799\u01b5\u0001\u0000\u0000\u0000\u079a\u079b"+ + "\u0003\u00dee\u0000\u079b\u079c\u0001\u0000\u0000\u0000\u079c\u079d\u0006"+ + "\u00d1 \u0000\u079d\u01b7\u0001\u0000\u0000\u0000\u079e\u079f\u0003\u00ee"+ + "m\u0000\u079f\u07a0\u0001\u0000\u0000\u0000\u07a0\u07a1\u0006\u00d2*\u0000"+ + "\u07a1\u01b9\u0001\u0000\u0000\u0000\u07a2\u07a3\u0003\u0014\u0000\u0000"+ + "\u07a3\u07a4\u0001\u0000\u0000\u0000\u07a4\u07a5\u0006\u00d3\u0000\u0000"+ + "\u07a5\u01bb\u0001\u0000\u0000\u0000\u07a6\u07a7\u0003\u0016\u0001\u0000"+ + "\u07a7\u07a8\u0001\u0000\u0000\u0000\u07a8\u07a9\u0006\u00d4\u0000\u0000"+ + "\u07a9\u01bd\u0001\u0000\u0000\u0000\u07aa\u07ab\u0003\u0018\u0002\u0000"+ + "\u07ab\u07ac\u0001\u0000\u0000\u0000\u07ac\u07ad\u0006\u00d5\u0000\u0000"+ + "\u07ad\u01bf\u0001\u0000\u0000\u0000\u07ae\u07af\u0003\u00c8Z\u0000\u07af"+ + "\u07b0\u0001\u0000\u0000\u0000\u07b0\u07b1\u0006\u00d6\u0012\u0000\u07b1"+ + "\u07b2\u0006\u00d6\u0013\u0000\u07b2\u01c1\u0001\u0000\u0000\u0000\u07b3"+ + "\u07b4\u0003\u0140\u0096\u0000\u07b4\u07b5\u0001\u0000\u0000\u0000\u07b5"+ + "\u07b6\u0006\u00d7\u0014\u0000\u07b6\u07b7\u0006\u00d7\u0013\u0000\u07b7"+ + "\u07b8\u0006\u00d7\u0013\u0000\u07b8\u01c3\u0001\u0000\u0000\u0000\u07b9"+ + "\u07ba\u0003\u00eem\u0000\u07ba\u07bb\u0001\u0000\u0000\u0000\u07bb\u07bc"+ + "\u0006\u00d8*\u0000\u07bc\u01c5\u0001\u0000\u0000\u0000\u07bd\u07be\u0003"+ + "\u00f2o\u0000\u07be\u07bf\u0001\u0000\u0000\u0000\u07bf\u07c0\u0006\u00d9"+ + "\u0018\u0000\u07c0\u01c7\u0001\u0000\u0000\u0000\u07c1\u07c2\u0003\u00f6"+ + "q\u0000\u07c2\u07c3\u0001\u0000\u0000\u0000\u07c3\u07c4\u0006\u00da\u0017"+ + "\u0000\u07c4\u01c9\u0001\u0000\u0000\u0000\u07c5\u07c6\u0003\u010a{\u0000"+ + "\u07c6\u07c7\u0001\u0000\u0000\u0000\u07c7\u07c8\u0006\u00db\u0015\u0000"+ + "\u07c8\u07c9\u0006\u00db.\u0000\u07c9\u01cb\u0001\u0000\u0000\u0000\u07ca"+ + "\u07cb\u0003\u0166\u00a9\u0000\u07cb\u07cc\u0001\u0000\u0000\u0000\u07cc"+ + "\u07cd\u0006\u00dc,\u0000\u07cd\u01cd\u0001\u0000\u0000\u0000\u07ce\u07cf"+ + "\u0003\u00dee\u0000\u07cf\u07d0\u0001\u0000\u0000\u0000\u07d0\u07d1\u0006"+ + "\u00dd \u0000\u07d1\u01cf\u0001\u0000\u0000\u0000\u07d2\u07d3\u0003\u0014"+ + "\u0000\u0000\u07d3\u07d4\u0001\u0000\u0000\u0000\u07d4\u07d5\u0006\u00de"+ + "\u0000\u0000\u07d5\u01d1\u0001\u0000\u0000\u0000\u07d6\u07d7\u0003\u0016"+ + "\u0001\u0000\u07d7\u07d8\u0001\u0000\u0000\u0000\u07d8\u07d9\u0006\u00df"+ + "\u0000\u0000\u07d9\u01d3\u0001\u0000\u0000\u0000\u07da\u07db\u0003\u0018"+ + "\u0002\u0000\u07db\u07dc\u0001\u0000\u0000\u0000\u07dc\u07dd\u0006\u00e0"+ + "\u0000\u0000\u07dd\u01d5\u0001\u0000\u0000\u0000\u07de\u07df\u0003\u00c8"+ + "Z\u0000\u07df\u07e0\u0001\u0000\u0000\u0000\u07e0\u07e1\u0006\u00e1\u0012"+ + "\u0000\u07e1\u07e2\u0006\u00e1\u0013\u0000\u07e2\u07e3\u0006\u00e1\u0013"+ + "\u0000\u07e3\u01d7\u0001\u0000\u0000\u0000\u07e4\u07e5\u0003\u0140\u0096"+ + "\u0000\u07e5\u07e6\u0001\u0000\u0000\u0000\u07e6\u07e7\u0006\u00e2\u0014"+ + "\u0000\u07e7\u07e8\u0006\u00e2\u0013\u0000\u07e8\u07e9\u0006\u00e2\u0013"+ + "\u0000\u07e9\u07ea\u0006\u00e2\u0013\u0000\u07ea\u01d9\u0001\u0000\u0000"+ + "\u0000\u07eb\u07ec\u0003\u00f2o\u0000\u07ec\u07ed\u0001\u0000\u0000\u0000"+ + "\u07ed\u07ee\u0006\u00e3\u0018\u0000\u07ee\u01db\u0001\u0000\u0000\u0000"+ + "\u07ef\u07f0\u0003\u00f6q\u0000\u07f0\u07f1\u0001\u0000\u0000\u0000\u07f1"+ + "\u07f2\u0006\u00e4\u0017\u0000\u07f2\u01dd\u0001\u0000\u0000\u0000\u07f3"+ + "\u07f4\u0003\u0240\u0116\u0000\u07f4\u07f5\u0001\u0000\u0000\u0000\u07f5"+ + "\u07f6\u0006\u00e5\"\u0000\u07f6\u01df\u0001\u0000\u0000\u0000\u07f7\u07f8"+ + "\u0003\u0014\u0000\u0000\u07f8\u07f9\u0001\u0000\u0000\u0000\u07f9\u07fa"+ + "\u0006\u00e6\u0000\u0000\u07fa\u01e1\u0001\u0000\u0000\u0000\u07fb\u07fc"+ + "\u0003\u0016\u0001\u0000\u07fc\u07fd\u0001\u0000\u0000\u0000\u07fd\u07fe"+ + "\u0006\u00e7\u0000\u0000\u07fe\u01e3\u0001\u0000\u0000\u0000\u07ff\u0800"+ + "\u0003\u0018\u0002\u0000\u0800\u0801\u0001\u0000\u0000\u0000\u0801\u0802"+ + "\u0006\u00e8\u0000\u0000\u0802\u01e5\u0001\u0000\u0000\u0000\u0803\u0804"+ + "\u0003(\n\u0000\u0804\u0805\u0001\u0000\u0000\u0000\u0805\u0806\u0006"+ + "\u00e9\u0013\u0000\u0806\u0807\u0006\u00e9\u0004\u0000\u0807\u01e7\u0001"+ + "\u0000\u0000\u0000\u0808\u0809\u0003\u010a{\u0000\u0809\u080a\u0001\u0000"+ + "\u0000\u0000\u080a\u080b\u0006\u00ea\u0015\u0000\u080b\u01e9\u0001\u0000"+ + "\u0000\u0000\u080c\u080d\u0003\u0142\u0097\u0000\u080d\u080e\u0001\u0000"+ + "\u0000\u0000\u080e\u080f\u0006\u00eb\u001c\u0000\u080f\u01eb\u0001\u0000"+ + "\u0000\u0000\u0810\u0811\u0003\u013a\u0093\u0000\u0811\u0812\u0001\u0000"+ + "\u0000\u0000\u0812\u0813\u0006\u00ec\u0019\u0000\u0813\u01ed\u0001\u0000"+ + "\u0000\u0000\u0814\u0815\u0003\u013c\u0094\u0000\u0815\u0816\u0001\u0000"+ + "\u0000\u0000\u0816\u0817\u0006\u00ed\u001a\u0000\u0817\u01ef\u0001\u0000"+ + "\u0000\u0000\u0818\u0819\u0003\u00f2o\u0000\u0819\u081a\u0001\u0000\u0000"+ + "\u0000\u081a\u081b\u0006\u00ee\u0018\u0000\u081b\u01f1\u0001\u0000\u0000"+ + "\u0000\u081c\u081d\u0003\u0124\u0088\u0000\u081d\u081e\u0001\u0000\u0000"+ + "\u0000\u081e\u081f\u0006\u00ef/\u0000\u081f\u01f3\u0001\u0000\u0000\u0000"+ + "\u0820\u0821\u0003\u0126\u0089\u0000\u0821\u0822\u0001\u0000\u0000\u0000"+ + "\u0822\u0823\u0006\u00f00\u0000\u0823\u01f5\u0001\u0000\u0000\u0000\u0824"+ + "\u0825\u0003\u00e2g\u0000\u0825\u0826\u0001\u0000\u0000\u0000\u0826\u0827"+ + "\u0006\u00f11\u0000\u0827\u01f7\u0001\u0000\u0000\u0000\u0828\u0829\u0003"+ + "\u00e0f\u0000\u0829\u082a\u0001\u0000\u0000\u0000\u082a\u082b\u0006\u00f2"+ + "2\u0000\u082b\u01f9\u0001\u0000\u0000\u0000\u082c\u082d\u0003\u010e}\u0000"+ + "\u082d\u082e\u0001\u0000\u0000\u0000\u082e\u082f\u0006\u00f3#\u0000\u082f"+ + "\u01fb\u0001\u0000\u0000\u0000\u0830\u0831\u0003\u0136\u0091\u0000\u0831"+ + "\u0832\u0001\u0000\u0000\u0000\u0832\u0833\u0006\u00f4$\u0000\u0833\u01fd"+ + "\u0001\u0000\u0000\u0000\u0834\u0835\u0003\u013e\u0095\u0000\u0835\u0836"+ + "\u0001\u0000\u0000\u0000\u0836\u0837\u0006\u00f5\'\u0000\u0837\u01ff\u0001"+ + "\u0000\u0000\u0000\u0838\u0839\u0003\u0140\u0096\u0000\u0839\u083a\u0001"+ + "\u0000\u0000\u0000\u083a\u083b\u0006\u00f6\u0014\u0000\u083b\u0201\u0001"+ + "\u0000\u0000\u0000\u083c\u083d\u0003\u00dee\u0000\u083d\u083e\u0001\u0000"+ + "\u0000\u0000\u083e\u083f\u0006\u00f7 \u0000\u083f\u0203\u0001\u0000\u0000"+ + "\u0000\u0840\u0841\u0003\u00ecl\u0000\u0841\u0842\u0001\u0000\u0000\u0000"+ + "\u0842\u0843\u0006\u00f8+\u0000\u0843\u0205\u0001\u0000\u0000\u0000\u0844"+ + "\u0845\u0003\u0014\u0000\u0000\u0845\u0846\u0001\u0000\u0000\u0000\u0846"+ + "\u0847\u0006\u00f9\u0000\u0000\u0847\u0207\u0001\u0000\u0000\u0000\u0848"+ + "\u0849\u0003\u0016\u0001\u0000\u0849\u084a\u0001\u0000\u0000\u0000\u084a"+ + "\u084b\u0006\u00fa\u0000\u0000\u084b\u0209\u0001\u0000\u0000\u0000\u084c"+ + "\u084d\u0003\u0018\u0002\u0000\u084d\u084e\u0001\u0000\u0000\u0000\u084e"+ + "\u084f\u0006\u00fb\u0000\u0000\u084f\u020b\u0001\u0000\u0000\u0000\u0850"+ + "\u0851\u0003\u00c8Z\u0000\u0851\u0852\u0001\u0000\u0000\u0000\u0852\u0853"+ + "\u0006\u00fc\u0012\u0000\u0853\u0854\u0006\u00fc\u0013\u0000\u0854\u020d"+ + "\u0001\u0000\u0000\u0000\u0855\u0856\u0003\u0140\u0096\u0000\u0856\u0857"+ + "\u0001\u0000\u0000\u0000\u0857\u0858\u0006\u00fd\u0014\u0000\u0858\u0859"+ + "\u0006\u00fd\u0013\u0000\u0859\u085a\u0006\u00fd\u0013\u0000\u085a\u020f"+ + "\u0001\u0000\u0000\u0000\u085b\u085c\u0003\u013a\u0093\u0000\u085c\u085d"+ + "\u0001\u0000\u0000\u0000\u085d\u085e\u0006\u00fe\u0019\u0000\u085e\u0211"+ + "\u0001\u0000\u0000\u0000\u085f\u0860\u0003\u013c\u0094\u0000\u0860\u0861"+ + "\u0001\u0000\u0000\u0000\u0861\u0862\u0006\u00ff\u001a\u0000\u0862\u0213"+ + "\u0001\u0000\u0000\u0000\u0863\u0864\u0003\u00f6q\u0000\u0864\u0865\u0001"+ + "\u0000\u0000\u0000\u0865\u0866\u0006\u0100\u0017\u0000\u0866\u0215\u0001"+ + "\u0000\u0000\u0000\u0867\u0868\u0003\u010e}\u0000\u0868\u0869\u0001\u0000"+ + "\u0000\u0000\u0869\u086a\u0006\u0101#\u0000\u086a\u0217\u0001\u0000\u0000"+ + "\u0000\u086b\u086c\u0003\u0136\u0091\u0000\u086c\u086d\u0001\u0000\u0000"+ + "\u0000\u086d\u086e\u0006\u0102$\u0000\u086e\u0219\u0001\u0000\u0000\u0000"+ + "\u086f\u0870\u0003\u0132\u008f\u0000\u0870\u0871\u0001\u0000\u0000\u0000"+ + "\u0871\u0872\u0006\u0103%\u0000\u0872\u021b\u0001\u0000\u0000\u0000\u0873"+ + "\u0874\u0003\u0138\u0092\u0000\u0874\u0875\u0001\u0000\u0000\u0000\u0875"+ + "\u0876\u0006\u0104&\u0000\u0876\u021d\u0001\u0000\u0000\u0000\u0877\u0878"+ + "\u0003\u0146\u0099\u0000\u0878\u0879\u0001\u0000\u0000\u0000\u0879\u087a"+ + "\u0006\u0105\u001b\u0000\u087a\u021f\u0001\u0000\u0000\u0000\u087b\u087c"+ + "\u0003\u0142\u0097\u0000\u087c\u087d\u0001\u0000\u0000\u0000\u087d\u087e"+ + "\u0006\u0106\u001c\u0000\u087e\u0221\u0001\u0000\u0000\u0000\u087f\u0880"+ + "\u0003\u0014\u0000\u0000\u0880\u0881\u0001\u0000\u0000\u0000\u0881\u0882"+ + "\u0006\u0107\u0000\u0000\u0882\u0223\u0001\u0000\u0000\u0000\u0883\u0884"+ + "\u0003\u0016\u0001\u0000\u0884\u0885\u0001\u0000\u0000\u0000\u0885\u0886"+ + "\u0006\u0108\u0000\u0000\u0886\u0225\u0001\u0000\u0000\u0000\u0887\u0888"+ + "\u0003\u0018\u0002\u0000\u0888\u0889\u0001\u0000\u0000\u0000\u0889\u088a"+ + "\u0006\u0109\u0000\u0000\u088a\u0227\u0001\u0000\u0000\u0000\u088b\u088c"+ + "\u0003\u00c8Z\u0000\u088c\u088d\u0001\u0000\u0000\u0000\u088d\u088e\u0006"+ + "\u010a\u0012\u0000\u088e\u088f\u0006\u010a\u0013\u0000\u088f\u0229\u0001"+ + "\u0000\u0000\u0000\u0890\u0891\u0003\u0140\u0096\u0000\u0891\u0892\u0001"+ + "\u0000\u0000\u0000\u0892\u0893\u0006\u010b\u0014\u0000\u0893\u0894\u0006"+ + "\u010b\u0013\u0000\u0894\u0895\u0006\u010b\u0013\u0000\u0895\u022b\u0001"+ + "\u0000\u0000\u0000\u0896\u0897\u0003\u00f6q\u0000\u0897\u0898\u0001\u0000"+ + "\u0000\u0000\u0898\u0899\u0006\u010c\u0017\u0000\u0899\u022d\u0001\u0000"+ + "\u0000\u0000\u089a\u089b\u0003\u013a\u0093\u0000\u089b\u089c\u0001\u0000"+ + "\u0000\u0000\u089c\u089d\u0006\u010d\u0019\u0000\u089d\u022f\u0001\u0000"+ + "\u0000\u0000\u089e\u089f\u0003\u013c\u0094\u0000\u089f\u08a0\u0001\u0000"+ + "\u0000\u0000\u08a0\u08a1\u0006\u010e\u001a\u0000\u08a1\u0231\u0001\u0000"+ + "\u0000\u0000\u08a2\u08a3\u0003\u00f2o\u0000\u08a3\u08a4\u0001\u0000\u0000"+ + "\u0000\u08a4\u08a5\u0006\u010f\u0018\u0000\u08a5\u0233\u0001\u0000\u0000"+ + "\u0000\u08a6\u08a7\u0003\u010e}\u0000\u08a7\u08a8\u0001\u0000\u0000\u0000"+ + "\u08a8\u08a9\u0006\u0110#\u0000\u08a9\u0235\u0001\u0000\u0000\u0000\u08aa"+ + "\u08ab\u0003\u0136\u0091\u0000\u08ab\u08ac\u0001\u0000\u0000\u0000\u08ac"+ + "\u08ad\u0006\u0111$\u0000\u08ad\u0237\u0001\u0000\u0000\u0000\u08ae\u08af"+ + "\u0003\u0132\u008f\u0000\u08af\u08b0\u0001\u0000\u0000\u0000\u08b0\u08b1"+ + "\u0006\u0112%\u0000\u08b1\u0239\u0001\u0000\u0000\u0000\u08b2\u08b3\u0003"+ + "\u0138\u0092\u0000\u08b3\u08b4\u0001\u0000\u0000\u0000\u08b4\u08b5\u0006"+ + "\u0113&\u0000\u08b5\u023b\u0001\u0000\u0000\u0000\u08b6\u08bb\u0003\u00cc"+ + "\\\u0000\u08b7\u08bb\u0003\u00ca[\u0000\u08b8\u08bb\u0003\u00dac\u0000"+ + "\u08b9\u08bb\u0003\u0128\u008a\u0000\u08ba\u08b6\u0001\u0000\u0000\u0000"+ + "\u08ba\u08b7\u0001\u0000\u0000\u0000\u08ba\u08b8\u0001\u0000\u0000\u0000"+ + "\u08ba\u08b9\u0001\u0000\u0000\u0000\u08bb\u023d\u0001\u0000\u0000\u0000"+ + "\u08bc\u08bf\u0003\u00cc\\\u0000\u08bd\u08bf\u0003\u0128\u008a\u0000\u08be"+ + "\u08bc\u0001\u0000\u0000\u0000\u08be\u08bd\u0001\u0000\u0000\u0000\u08bf"+ + "\u08c3\u0001\u0000\u0000\u0000\u08c0\u08c2\u0003\u023c\u0114\u0000\u08c1"+ + "\u08c0\u0001\u0000\u0000\u0000\u08c2\u08c5\u0001\u0000\u0000\u0000\u08c3"+ + "\u08c1\u0001\u0000\u0000\u0000\u08c3\u08c4\u0001\u0000\u0000\u0000\u08c4"+ + "\u08d0\u0001\u0000\u0000\u0000\u08c5\u08c3\u0001\u0000\u0000\u0000\u08c6"+ + "\u08c9\u0003\u00dac\u0000\u08c7\u08c9\u0003\u00d4`\u0000\u08c8\u08c6\u0001"+ + "\u0000\u0000\u0000\u08c8\u08c7\u0001\u0000\u0000\u0000\u08c9\u08cb\u0001"+ + "\u0000\u0000\u0000\u08ca\u08cc\u0003\u023c\u0114\u0000\u08cb\u08ca\u0001"+ + "\u0000\u0000\u0000\u08cc\u08cd\u0001\u0000\u0000\u0000\u08cd\u08cb\u0001"+ + "\u0000\u0000\u0000\u08cd\u08ce\u0001\u0000\u0000\u0000\u08ce\u08d0\u0001"+ + "\u0000\u0000\u0000\u08cf\u08be\u0001\u0000\u0000\u0000\u08cf\u08c8\u0001"+ + "\u0000\u0000\u0000\u08d0\u023f\u0001\u0000\u0000\u0000\u08d1\u08d4\u0003"+ + "\u023e\u0115\u0000\u08d2\u08d4\u0003\u0144\u0098\u0000\u08d3\u08d1\u0001"+ + "\u0000\u0000\u0000\u08d3\u08d2\u0001\u0000\u0000\u0000\u08d4\u08d5\u0001"+ + "\u0000\u0000\u0000\u08d5\u08d3\u0001\u0000\u0000\u0000\u08d5\u08d6\u0001"+ + "\u0000\u0000\u0000\u08d6\u0241\u0001\u0000\u0000\u0000\u08d7\u08d8\u0003"+ + "\u0014\u0000\u0000\u08d8\u08d9\u0001\u0000\u0000\u0000\u08d9\u08da\u0006"+ + "\u0117\u0000\u0000\u08da\u0243\u0001\u0000\u0000\u0000\u08db\u08dc\u0003"+ + "\u0016\u0001\u0000\u08dc\u08dd\u0001\u0000\u0000\u0000\u08dd\u08de\u0006"+ + "\u0118\u0000\u0000\u08de\u0245\u0001\u0000\u0000\u0000\u08df\u08e0\u0003"+ + "\u0018\u0002\u0000\u08e0\u08e1\u0001\u0000\u0000\u0000\u08e1\u08e2\u0006"+ + "\u0119\u0000\u0000\u08e2\u0247\u0001\u0000\u0000\u0000\u08e3\u08e4\u0003"+ + "\u0142\u0097\u0000\u08e4\u08e5\u0001\u0000\u0000\u0000\u08e5\u08e6\u0006"+ + "\u011a\u001c\u0000\u08e6\u0249\u0001\u0000\u0000\u0000\u08e7\u08e8\u0003"+ + "\u0146\u0099\u0000\u08e8\u08e9\u0001\u0000\u0000\u0000\u08e9\u08ea\u0006"+ + "\u011b\u001b\u0000\u08ea\u024b\u0001\u0000\u0000\u0000\u08eb\u08ec\u0003"+ + "\u00e8j\u0000\u08ec\u08ed\u0001\u0000\u0000\u0000\u08ed\u08ee\u0006\u011c"+ + "!\u0000\u08ee\u024d\u0001\u0000\u0000\u0000\u08ef\u08f0\u0003\u0136\u0091"+ + "\u0000\u08f0\u08f1\u0001\u0000\u0000\u0000\u08f1\u08f2\u0006\u011d$\u0000"+ + "\u08f2\u024f\u0001\u0000\u0000\u0000\u08f3\u08f4\u0003\u0166\u00a9\u0000"+ + "\u08f4\u08f5\u0001\u0000\u0000\u0000\u08f5\u08f6\u0006\u011e,\u0000\u08f6"+ + "\u0251\u0001\u0000\u0000\u0000\u08f7\u08f8\u0003\u00dee\u0000\u08f8\u08f9"+ + "\u0001\u0000\u0000\u0000\u08f9\u08fa\u0006\u011f \u0000\u08fa\u0253\u0001"+ + "\u0000\u0000\u0000\u08fb\u08fc\u0003\u00eem\u0000\u08fc\u08fd\u0001\u0000"+ + "\u0000\u0000\u08fd\u08fe\u0006\u0120*\u0000\u08fe\u0255\u0001\u0000\u0000"+ + "\u0000\u08ff\u0900\u0003\u00ecl\u0000\u0900\u0901\u0001\u0000\u0000\u0000"+ + "\u0901\u0902\u0006\u0121+\u0000\u0902\u0257\u0001\u0000\u0000\u0000\u0903"+ + "\u0904\u0003\u00f2o\u0000\u0904\u0905\u0001\u0000\u0000\u0000\u0905\u0906"+ + "\u0006\u0122\u0018\u0000\u0906\u0259\u0001\u0000\u0000\u0000\u0907\u0908"+ + "\u0003\u00c8Z\u0000\u0908\u0909\u0001\u0000\u0000\u0000\u0909\u090a\u0006"+ + "\u0123\u0012\u0000\u090a\u090b\u0006\u0123\u0013\u0000\u090b\u025b\u0001"+ + "\u0000\u0000\u0000\u090c\u090d\u0003\u013e\u0095\u0000\u090d\u090e\u0006"+ + "\u01243\u0000\u090e\u090f\u0001\u0000\u0000\u0000\u090f\u0910\u0006\u0124"+ + "\'\u0000\u0910\u025d\u0001\u0000\u0000\u0000\u0911\u0912\u0005)\u0000"+ + "\u0000\u0912\u0913\u0004\u0125\u0007\u0000\u0913\u0914\u0006\u01254\u0000"+ + "\u0914\u0915\u0001\u0000\u0000\u0000\u0915\u0916\u0006\u0125\u0014\u0000"+ + "\u0916\u025f\u0001\u0000\u0000\u0000\u0917\u0918\u0005)\u0000\u0000\u0918"+ + "\u0919\u0004\u0126\b\u0000\u0919\u091a\u0006\u01265\u0000\u091a\u091b"+ + "\u0001\u0000\u0000\u0000\u091b\u091c\u0006\u0126\u0014\u0000\u091c\u091d"+ + "\u0006\u0126\u0013\u0000\u091d\u0261\u0001\u0000\u0000\u0000\u091e\u091f"+ + "\u0003\u0014\u0000\u0000\u091f\u0920\u0001\u0000\u0000\u0000\u0920\u0921"+ + "\u0006\u0127\u0000\u0000\u0921\u0263\u0001\u0000\u0000\u0000\u0922\u0923"+ + "\u0003\u0016\u0001\u0000\u0923\u0924\u0001\u0000\u0000\u0000\u0924\u0925"+ + "\u0006\u0128\u0000\u0000\u0925\u0265\u0001\u0000\u0000\u0000\u0926\u0927"+ + "\u0003\u0018\u0002\u0000\u0927\u0928\u0001\u0000\u0000\u0000\u0928\u0929"+ + "\u0006\u0129\u0000\u0000\u0929\u0267\u0001\u0000\u0000\u0000\u092a\u092e"+ + "\u0005#\u0000\u0000\u092b\u092d\b\u0000\u0000\u0000\u092c\u092b\u0001"+ + "\u0000\u0000\u0000\u092d\u0930\u0001\u0000\u0000\u0000\u092e\u092c\u0001"+ + "\u0000\u0000\u0000\u092e\u092f\u0001\u0000\u0000\u0000\u092f\u0932\u0001"+ + "\u0000\u0000\u0000\u0930\u092e\u0001\u0000\u0000\u0000\u0931\u0933\u0005"+ + "\r\u0000\u0000\u0932\u0931\u0001\u0000\u0000\u0000\u0932\u0933\u0001\u0000"+ + "\u0000\u0000\u0933\u0935\u0001\u0000\u0000\u0000\u0934\u0936\u0005\n\u0000"+ + "\u0000\u0935\u0934\u0001\u0000\u0000\u0000\u0935\u0936\u0001\u0000\u0000"+ + "\u0000\u0936\u0269\u0001\u0000\u0000\u0000\u0937\u093d\u0005\'\u0000\u0000"+ + "\u0938\u0939\u0005\\\u0000\u0000\u0939\u093c\t\u0000\u0000\u0000\u093a"+ + "\u093c\b%\u0000\u0000\u093b\u0938\u0001\u0000\u0000\u0000\u093b\u093a"+ + "\u0001\u0000\u0000\u0000\u093c\u093f\u0001\u0000\u0000\u0000\u093d\u093b"+ + "\u0001\u0000\u0000\u0000\u093d\u093e\u0001\u0000\u0000\u0000\u093e\u0940"+ + "\u0001\u0000\u0000\u0000\u093f\u093d\u0001\u0000\u0000\u0000\u0940\u0941"+ + "\u0005\'\u0000\u0000\u0941\u026b\u0001\u0000\u0000\u0000\u0942\u0943\b"+ + "&\u0000\u0000\u0943\u026d\u0001\u0000\u0000\u0000\u0944\u0945\u0003\u00c8"+ + "Z\u0000\u0945\u0946\u0001\u0000\u0000\u0000\u0946\u0947\u0006\u012d\u0012"+ + "\u0000\u0947\u0948\u0006\u012d\u0013\u0000\u0948\u026f\u0001\u0000\u0000"+ + "\u0000\u0949\u094a\u0003\u0140\u0096\u0000\u094a\u094b\u0001\u0000\u0000"+ + "\u0000\u094b\u094c\u0006\u012e\u0014\u0000\u094c\u094d\u0006\u012e\u0013"+ + "\u0000\u094d\u094e\u0006\u012e\u0013\u0000\u094e\u0271\u0001\u0000\u0000"+ + "\u0000\u094f\u0950\u0003\u013a\u0093\u0000\u0950\u0951\u0001\u0000\u0000"+ + "\u0000\u0951\u0952\u0006\u012f\u0019\u0000\u0952\u0273\u0001\u0000\u0000"+ + "\u0000\u0953\u0954\u0003\u013c\u0094\u0000\u0954\u0955\u0001\u0000\u0000"+ + "\u0000\u0955\u0956\u0006\u0130\u001a\u0000\u0956\u0275\u0001\u0000\u0000"+ + "\u0000\u0957\u0958\u0003\u00e8j\u0000\u0958\u0959\u0001\u0000\u0000\u0000"+ + "\u0959\u095a\u0006\u0131!\u0000\u095a\u0277\u0001\u0000\u0000\u0000\u095b"+ + "\u095c\u0003\u00f2o\u0000\u095c\u095d\u0001\u0000\u0000\u0000\u095d\u095e"+ + "\u0006\u0132\u0018\u0000\u095e\u0279\u0001\u0000\u0000\u0000\u095f\u0960"+ + "\u0003\u00f6q\u0000\u0960\u0961\u0001\u0000\u0000\u0000\u0961\u0962\u0006"+ + "\u0133\u0017\u0000\u0962\u027b\u0001\u0000\u0000\u0000\u0963\u0964\u0003"+ + "\u010e}\u0000\u0964\u0965\u0001\u0000\u0000\u0000\u0965\u0966\u0006\u0134"+ + "#\u0000\u0966\u027d\u0001\u0000\u0000\u0000\u0967\u0968\u0003\u0136\u0091"+ + "\u0000\u0968\u0969\u0001\u0000\u0000\u0000\u0969\u096a\u0006\u0135$\u0000"+ + "\u096a\u027f\u0001\u0000\u0000\u0000\u096b\u096c\u0003\u0132\u008f\u0000"+ + "\u096c\u096d\u0001\u0000\u0000\u0000\u096d\u096e\u0006\u0136%\u0000\u096e"+ + "\u0281\u0001\u0000\u0000\u0000\u096f\u0970\u0003\u0138\u0092\u0000\u0970"+ + "\u0971\u0001\u0000\u0000\u0000\u0971\u0972\u0006\u0137&\u0000\u0972\u0283"+ + "\u0001\u0000\u0000\u0000\u0973\u0974\u0007\u0004\u0000\u0000\u0974\u0975"+ + "\u0007\u0011\u0000\u0000\u0975\u0285\u0001\u0000\u0000\u0000\u0976\u0977"+ + "\u0003\u0240\u0116\u0000\u0977\u0978\u0001\u0000\u0000\u0000\u0978\u0979"+ + "\u0006\u0139\"\u0000\u0979\u0287\u0001\u0000\u0000\u0000\u097a\u097b\u0003"+ + "\u0014\u0000\u0000\u097b\u097c\u0001\u0000\u0000\u0000\u097c\u097d\u0006"+ + "\u013a\u0000\u0000\u097d\u0289\u0001\u0000\u0000\u0000\u097e\u097f\u0003"+ + "\u0016\u0001\u0000\u097f\u0980\u0001\u0000\u0000\u0000\u0980\u0981\u0006"+ + "\u013b\u0000\u0000\u0981\u028b\u0001\u0000\u0000\u0000\u0982\u0983\u0003"+ + "\u0018\u0002\u0000\u0983\u0984\u0001\u0000\u0000\u0000\u0984\u0985\u0006"+ + "\u013c\u0000\u0000\u0985\u028d\u0001\u0000\u0000\u0000\u0986\u0987\u0003"+ + "\u0112\u007f\u0000\u0987\u0988\u0001\u0000\u0000\u0000\u0988\u0989\u0006"+ + "\u013d6\u0000\u0989\u028f\u0001\u0000\u0000\u0000\u098a\u098b\u0003\u00f8"+ + "r\u0000\u098b\u098c\u0001\u0000\u0000\u0000\u098c\u098d\u0006\u013e7\u0000"+ + "\u098d\u0291\u0001\u0000\u0000\u0000\u098e\u098f\u0003\u0106y\u0000\u098f"+ + "\u0990\u0001\u0000\u0000\u0000\u0990\u0991\u0006\u013f8\u0000\u0991\u0293"+ + "\u0001\u0000\u0000\u0000\u0992\u0993\u0003\u00f0n\u0000\u0993\u0994\u0001"+ + "\u0000\u0000\u0000\u0994\u0995\u0006\u01409\u0000\u0995\u0996\u0006\u0140"+ + "\u0013\u0000\u0996\u0295\u0001\u0000\u0000\u0000\u0997\u0998\u0003\u00e8"+ + "j\u0000\u0998\u0999\u0001\u0000\u0000\u0000\u0999\u099a\u0006\u0141!\u0000"+ + "\u099a\u0297\u0001\u0000\u0000\u0000\u099b\u099c\u0003\u00dee\u0000\u099c"+ + "\u099d\u0001\u0000\u0000\u0000\u099d\u099e\u0006\u0142 \u0000\u099e\u0299"+ + "\u0001\u0000\u0000\u0000\u099f\u09a0\u0003\u0142\u0097\u0000\u09a0\u09a1"+ + "\u0001\u0000\u0000\u0000\u09a1\u09a2\u0006\u0143\u001c\u0000\u09a2\u029b"+ + "\u0001\u0000\u0000\u0000\u09a3\u09a4\u0003\u0146\u0099\u0000\u09a4\u09a5"+ + "\u0001\u0000\u0000\u0000\u09a5\u09a6\u0006\u0144\u001b\u0000\u09a6\u029d"+ + "\u0001\u0000\u0000\u0000\u09a7\u09a8\u0003\u00e2g\u0000\u09a8\u09a9\u0001"+ + "\u0000\u0000\u0000\u09a9\u09aa\u0006\u01451\u0000\u09aa\u029f\u0001\u0000"+ + "\u0000\u0000\u09ab\u09ac\u0003\u00e0f\u0000\u09ac\u09ad\u0001\u0000\u0000"+ + "\u0000\u09ad\u09ae\u0006\u01462\u0000\u09ae\u02a1\u0001\u0000\u0000\u0000"+ + "\u09af\u09b0\u0003\u00eem\u0000\u09b0\u09b1\u0001\u0000\u0000\u0000\u09b1"+ + "\u09b2\u0006\u0147*\u0000\u09b2\u02a3\u0001\u0000\u0000\u0000\u09b3\u09b4"+ + "\u0003\u00f2o\u0000\u09b4\u09b5\u0001\u0000\u0000\u0000\u09b5\u09b6\u0006"+ + "\u0148\u0018\u0000\u09b6\u02a5\u0001\u0000\u0000\u0000\u09b7\u09b8\u0003"+ + "\u00f6q\u0000\u09b8\u09b9\u0001\u0000\u0000\u0000\u09b9\u09ba\u0006\u0149"+ + "\u0017\u0000\u09ba\u02a7\u0001\u0000\u0000\u0000\u09bb\u09bc\u0003\u010e"+ + "}\u0000\u09bc\u09bd\u0001\u0000\u0000\u0000\u09bd\u09be\u0006\u014a#\u0000"+ + "\u09be\u02a9\u0001\u0000\u0000\u0000\u09bf\u09c0\u0003\u0136\u0091\u0000"+ + "\u09c0\u09c1\u0001\u0000\u0000\u0000\u09c1\u09c2\u0006\u014b$\u0000\u09c2"+ + "\u02ab\u0001\u0000\u0000\u0000\u09c3\u09c4\u0003\u012e\u008d\u0000\u09c4"+ + "\u09c5\u0001\u0000\u0000\u0000\u09c5\u09c6\u0006\u014c:\u0000\u09c6\u02ad"+ + "\u0001\u0000\u0000\u0000\u09c7\u09c8\u0003\u0130\u008e\u0000\u09c8\u09c9"+ + "\u0001\u0000\u0000\u0000\u09c9\u09ca\u0006\u014d;\u0000\u09ca\u02af\u0001"+ + "\u0000\u0000\u0000\u09cb\u09cc\u0003\u0132\u008f\u0000\u09cc\u09cd\u0001"+ + "\u0000\u0000\u0000\u09cd\u09ce\u0006\u014e%\u0000\u09ce\u02b1\u0001\u0000"+ + "\u0000\u0000\u09cf\u09d0\u0003\u0138\u0092\u0000\u09d0\u09d1\u0001\u0000"+ + "\u0000\u0000\u09d1\u09d2\u0006\u014f&\u0000\u09d2\u02b3\u0001\u0000\u0000"+ + "\u0000\u09d3\u09d4\u0003\u013a\u0093\u0000\u09d4\u09d5\u0001\u0000\u0000"+ + "\u0000\u09d5\u09d6\u0006\u0150\u0019\u0000\u09d6\u02b5\u0001\u0000\u0000"+ + "\u0000\u09d7\u09d8\u0003\u013c\u0094\u0000\u09d8\u09d9\u0001\u0000\u0000"+ + "\u0000\u09d9\u09da\u0006\u0151\u001a\u0000\u09da\u02b7\u0001\u0000\u0000"+ + "\u0000\u09db\u09dc\u0003\u0240\u0116\u0000\u09dc\u09dd\u0001\u0000\u0000"+ + "\u0000\u09dd\u09de\u0006\u0152\"\u0000\u09de\u02b9\u0001\u0000\u0000\u0000"+ + "\u09df\u09e0\u0003\u0014\u0000\u0000\u09e0\u09e1\u0001\u0000\u0000\u0000"+ + "\u09e1\u09e2\u0006\u0153\u0000\u0000\u09e2\u02bb\u0001\u0000\u0000\u0000"+ + "\u09e3\u09e4\u0003\u0016\u0001\u0000\u09e4\u09e5\u0001\u0000\u0000\u0000"+ + "\u09e5\u09e6\u0006\u0154\u0000\u0000\u09e6\u02bd\u0001\u0000\u0000\u0000"+ + "\u09e7\u09e8\u0003\u0018\u0002\u0000\u09e8\u09e9\u0001\u0000\u0000\u0000"+ + "\u09e9\u09ea\u0006\u0155\u0000\u0000\u09ea\u02bf\u0001\u0000\u0000\u0000"+ + "\u09eb\u09ec\u0003\u00c8Z\u0000\u09ec\u09ed\u0001\u0000\u0000\u0000\u09ed"+ + "\u09ee\u0006\u0156\u0012\u0000\u09ee\u09ef\u0006\u0156\u0013\u0000\u09ef"+ + "\u02c1\u0001\u0000\u0000\u0000\u09f0\u09f1\u0007\n\u0000\u0000\u09f1\u09f2"+ + "\u0007\u0005\u0000\u0000\u09f2\u09f3\u0007\u0016\u0000\u0000\u09f3\u09f4"+ + "\u0007\t\u0000\u0000\u09f4\u02c3\u0001\u0000\u0000\u0000\u09f5\u09f6\u0003"+ + "\u0014\u0000\u0000\u09f6\u09f7\u0001\u0000\u0000\u0000\u09f7\u09f8\u0006"+ + "\u0158\u0000\u0000\u09f8\u02c5\u0001\u0000\u0000\u0000\u09f9\u09fa\u0003"+ + "\u0016\u0001\u0000\u09fa\u09fb\u0001\u0000\u0000\u0000\u09fb\u09fc\u0006"+ + "\u0159\u0000\u0000\u09fc\u02c7\u0001\u0000\u0000\u0000\u09fd\u09fe\u0003"+ + "\u0018\u0002\u0000\u09fe\u09ff\u0001\u0000\u0000\u0000\u09ff\u0a00\u0006"+ + "\u015a\u0000\u0000\u0a00\u02c9\u0001\u0000\u0000\u0000M\u0000\u0001\u0002"+ + "\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011"+ + "\u0012\u0013\u02d0\u02d4\u02d7\u02e0\u02e2\u02ed\u046f\u04c4\u04c8\u04cd"+ + "\u0551\u0556\u055f\u0566\u056b\u056d\u0578\u0580\u0583\u0585\u058a\u058f"+ + "\u0595\u059c\u05a1\u05a7\u05aa\u05b2\u05b6\u0643\u0648\u064f\u0651\u0656"+ + "\u065b\u0662\u0664\u067e"; private static final String _serializedATNSegment1 = - "\u0007\u0094\u0000\u0007R\u0000\u0007e\u0000\u0007d\u0000\u0007f\u0000"+ - "\u0007i\u0000\u0005\u0000\u0000\u0007\u0011\u0000\u0007B\u0000\u0007A"+ - "\u0000\u0007q\u0000\u0007@\u0000\u0005\f\u0000\u0007]\u0000\u0007^\u0000"+ - "\u0007<\u0000\u0007;\u0000\u0001\u0123\u0000\u0001\u0124\u0001\u0001\u0125"+ - "\u0002\u0007T\u0000\u0007G\u0000\u0007N\u0000\u0007C\u0000\u0007b\u0000"+ - "\u0007c\u0000"; + "\u0683\u0688\u068a\u0690\u06dc\u06e1\u08ba\u08be\u08c3\u08c8\u08cd\u08cf"+ + "\u08d3\u08d5\u092e\u0932\u0935\u093b\u093d<\u0000\u0001\u0000\u0005\u0001"+ + "\u0000\u0005\u0002\u0000\u0005\u0004\u0000\u0005\u0005\u0000\u0005\u0006"+ + "\u0000\u0005\u0007\u0000\u0005\b\u0000\u0005\t\u0000\u0005\n\u0000\u0005"+ + "\u000b\u0000\u0005\r\u0000\u0005\u000e\u0000\u0005\u000f\u0000\u0005\u0010"+ + "\u0000\u0005\u0011\u0000\u0005\u0012\u0000\u0005\u0013\u0000\u0007:\u0000"+ + "\u0004\u0000\u0000\u0007k\u0000\u0007Q\u0000\u0007\u009f\u0000\u0007G"+ + "\u0000\u0007E\u0000\u0007h\u0000\u0007i\u0000\u0007m\u0000\u0007l\u0000"+ + "\u0005\u0003\u0000\u0007V\u0000\u00070\u0000\u0007;\u0000\u0007@\u0000"+ + "\u0007\u0095\u0000\u0007S\u0000\u0007f\u0000\u0007e\u0000\u0007g\u0000"+ + "\u0007j\u0000\u0005\u0000\u0000\u0007\u0011\u0000\u0007C\u0000\u0007B"+ + "\u0000\u0007r\u0000\u0007A\u0000\u0005\f\u0000\u0007^\u0000\u0007_\u0000"+ + "\u0007=\u0000\u0007<\u0000\u0001\u0124\u0000\u0001\u0125\u0001\u0001\u0126"+ + "\u0002\u0007U\u0000\u0007H\u0000\u0007O\u0000\u0007D\u0000\u0007c\u0000"+ + "\u0007d\u0000"; public static final String _serializedATN = Utils.join( new String[] { _serializedATNSegment0, diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp index 46c838ab364e4..b8f83fa43a734 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp @@ -21,6 +21,7 @@ null 'metrics_info' 'registered_domain' 'ts_info' +'user_agent' 'from' 'ts' null @@ -192,6 +193,7 @@ URI_PARTS METRICS_INFO REGISTERED_DOMAIN TS_INFO +USER_AGENT FROM TS DEV_EXTERNAL @@ -418,6 +420,7 @@ lookupCommand insistCommand uriPartsCommand registeredDomainCommand +userAgentCommand setCommand setField mmrCommand @@ -458,4 +461,4 @@ promqlIndexString atn: -[4, 1, 168, 1159, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 1, 0, 5, 0, 230, 8, 0, 10, 0, 12, 0, 233, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 247, 8, 2, 10, 2, 12, 2, 250, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 261, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 292, 8, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 5, 8, 305, 8, 8, 10, 8, 12, 8, 308, 9, 8, 1, 9, 1, 9, 1, 9, 3, 9, 313, 8, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 330, 8, 13, 10, 13, 12, 13, 333, 9, 13, 1, 13, 3, 13, 336, 8, 13, 1, 14, 1, 14, 3, 14, 340, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 346, 8, 15, 10, 15, 12, 15, 349, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 3, 16, 356, 8, 16, 1, 16, 1, 16, 1, 16, 3, 16, 361, 8, 16, 1, 16, 3, 16, 364, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 378, 8, 21, 10, 21, 12, 21, 381, 9, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 388, 8, 23, 1, 23, 1, 23, 3, 23, 392, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 397, 8, 24, 10, 24, 12, 24, 400, 9, 24, 1, 25, 1, 25, 1, 25, 3, 25, 405, 8, 25, 1, 26, 1, 26, 1, 26, 3, 26, 410, 8, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 419, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 424, 8, 27, 10, 27, 12, 27, 427, 9, 27, 1, 28, 1, 28, 1, 28, 3, 28, 432, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 441, 8, 28, 1, 29, 1, 29, 1, 29, 5, 29, 446, 8, 29, 10, 29, 12, 29, 449, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 454, 8, 30, 10, 30, 12, 30, 457, 9, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 3, 32, 464, 8, 32, 1, 33, 1, 33, 3, 33, 468, 8, 33, 1, 34, 1, 34, 3, 34, 472, 8, 34, 1, 35, 1, 35, 1, 35, 3, 35, 477, 8, 35, 1, 36, 1, 36, 3, 36, 481, 8, 36, 1, 37, 1, 37, 1, 37, 3, 37, 486, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 493, 8, 38, 10, 38, 12, 38, 496, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 502, 8, 39, 10, 39, 12, 39, 505, 9, 39, 1, 40, 1, 40, 3, 40, 509, 8, 40, 1, 40, 1, 40, 3, 40, 513, 8, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 525, 8, 43, 10, 43, 12, 43, 528, 9, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 538, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 544, 8, 45, 1, 46, 1, 46, 1, 46, 5, 46, 549, 8, 46, 10, 46, 12, 46, 552, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 3, 48, 560, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 567, 8, 49, 10, 49, 12, 49, 570, 9, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 589, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 595, 8, 54, 10, 54, 12, 54, 598, 9, 54, 3, 54, 600, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 3, 56, 607, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 617, 8, 58, 10, 58, 12, 58, 620, 9, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 629, 8, 59, 1, 60, 1, 60, 1, 60, 1, 61, 4, 61, 635, 8, 61, 11, 61, 12, 61, 636, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 649, 8, 63, 10, 63, 12, 63, 652, 9, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 660, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 671, 8, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 681, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 687, 8, 67, 3, 67, 689, 8, 67, 1, 68, 1, 68, 3, 68, 693, 8, 68, 1, 68, 5, 68, 696, 8, 68, 10, 68, 12, 68, 699, 9, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 712, 8, 69, 1, 70, 1, 70, 1, 70, 5, 70, 717, 8, 70, 10, 70, 12, 70, 720, 9, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 752, 8, 78, 1, 79, 1, 79, 3, 79, 756, 8, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 3, 80, 766, 8, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 775, 8, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 5, 81, 782, 8, 81, 10, 81, 12, 81, 785, 9, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 3, 81, 792, 8, 81, 1, 81, 1, 81, 1, 81, 3, 81, 797, 8, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 5, 81, 805, 8, 81, 10, 81, 12, 81, 808, 9, 81, 1, 82, 1, 82, 3, 82, 812, 8, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 819, 8, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 826, 8, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 833, 8, 82, 10, 82, 12, 82, 836, 9, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 842, 8, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 849, 8, 82, 10, 82, 12, 82, 852, 9, 82, 1, 82, 1, 82, 3, 82, 856, 8, 82, 1, 83, 1, 83, 1, 83, 3, 83, 861, 8, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 871, 8, 84, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 877, 8, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 5, 85, 885, 8, 85, 10, 85, 12, 85, 888, 9, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 898, 8, 86, 1, 86, 1, 86, 1, 86, 5, 86, 903, 8, 86, 10, 86, 12, 86, 906, 9, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 5, 87, 914, 8, 87, 10, 87, 12, 87, 917, 9, 87, 1, 87, 1, 87, 3, 87, 921, 8, 87, 3, 87, 923, 8, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 3, 88, 930, 8, 88, 1, 89, 1, 89, 1, 89, 1, 89, 5, 89, 936, 8, 89, 10, 89, 12, 89, 939, 9, 89, 3, 89, 941, 8, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 3, 91, 951, 8, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 5, 92, 966, 8, 92, 10, 92, 12, 92, 969, 9, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 5, 92, 977, 8, 92, 10, 92, 12, 92, 980, 9, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 5, 92, 988, 8, 92, 10, 92, 12, 92, 991, 9, 92, 1, 92, 1, 92, 3, 92, 995, 8, 92, 1, 93, 1, 93, 1, 94, 1, 94, 3, 94, 1001, 8, 94, 1, 95, 3, 95, 1004, 8, 95, 1, 95, 1, 95, 1, 96, 3, 96, 1009, 8, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 3, 100, 1025, 8, 100, 1, 100, 1, 100, 1, 100, 3, 100, 1030, 8, 100, 1, 101, 1, 101, 1, 101, 1, 101, 5, 101, 1036, 8, 101, 10, 101, 12, 101, 1039, 9, 101, 1, 102, 1, 102, 5, 102, 1043, 8, 102, 10, 102, 12, 102, 1046, 9, 102, 1, 102, 1, 102, 1, 102, 3, 102, 1051, 8, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 5, 102, 1058, 8, 102, 10, 102, 12, 102, 1061, 9, 102, 1, 102, 1, 102, 1, 102, 3, 102, 1066, 8, 102, 1, 102, 1, 102, 1, 102, 5, 102, 1071, 8, 102, 10, 102, 12, 102, 1074, 9, 102, 1, 102, 1, 102, 1, 102, 3, 102, 1079, 8, 102, 1, 102, 1, 102, 4, 102, 1083, 8, 102, 11, 102, 12, 102, 1084, 1, 102, 1, 102, 1, 102, 1, 102, 5, 102, 1091, 8, 102, 10, 102, 12, 102, 1094, 9, 102, 1, 102, 4, 102, 1097, 8, 102, 11, 102, 12, 102, 1098, 3, 102, 1101, 8, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1114, 8, 106, 10, 106, 12, 106, 1117, 9, 106, 1, 106, 1, 106, 3, 106, 1121, 8, 106, 1, 107, 1, 107, 1, 108, 4, 108, 1126, 8, 108, 11, 108, 12, 108, 1127, 1, 108, 1, 108, 5, 108, 1132, 8, 108, 10, 108, 12, 108, 1135, 9, 108, 1, 108, 3, 108, 1138, 8, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 3, 109, 1149, 8, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 0, 5, 4, 126, 162, 170, 172, 114, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 0, 14, 2, 0, 58, 58, 113, 113, 1, 0, 107, 108, 2, 0, 62, 62, 69, 69, 2, 0, 72, 72, 75, 75, 2, 0, 47, 47, 58, 58, 1, 0, 93, 94, 1, 0, 95, 97, 2, 0, 71, 71, 84, 84, 2, 0, 86, 86, 88, 92, 2, 0, 29, 29, 31, 32, 3, 0, 58, 58, 101, 101, 107, 108, 8, 0, 58, 58, 63, 63, 65, 66, 68, 68, 101, 101, 107, 108, 113, 113, 155, 157, 2, 0, 107, 107, 113, 113, 3, 0, 58, 58, 107, 107, 113, 113, 1214, 0, 231, 1, 0, 0, 0, 2, 237, 1, 0, 0, 0, 4, 240, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 8, 291, 1, 0, 0, 0, 10, 293, 1, 0, 0, 0, 12, 296, 1, 0, 0, 0, 14, 298, 1, 0, 0, 0, 16, 301, 1, 0, 0, 0, 18, 312, 1, 0, 0, 0, 20, 316, 1, 0, 0, 0, 22, 319, 1, 0, 0, 0, 24, 322, 1, 0, 0, 0, 26, 326, 1, 0, 0, 0, 28, 339, 1, 0, 0, 0, 30, 341, 1, 0, 0, 0, 32, 363, 1, 0, 0, 0, 34, 365, 1, 0, 0, 0, 36, 367, 1, 0, 0, 0, 38, 369, 1, 0, 0, 0, 40, 371, 1, 0, 0, 0, 42, 373, 1, 0, 0, 0, 44, 382, 1, 0, 0, 0, 46, 385, 1, 0, 0, 0, 48, 393, 1, 0, 0, 0, 50, 401, 1, 0, 0, 0, 52, 418, 1, 0, 0, 0, 54, 420, 1, 0, 0, 0, 56, 440, 1, 0, 0, 0, 58, 442, 1, 0, 0, 0, 60, 450, 1, 0, 0, 0, 62, 458, 1, 0, 0, 0, 64, 463, 1, 0, 0, 0, 66, 467, 1, 0, 0, 0, 68, 471, 1, 0, 0, 0, 70, 476, 1, 0, 0, 0, 72, 480, 1, 0, 0, 0, 74, 482, 1, 0, 0, 0, 76, 487, 1, 0, 0, 0, 78, 497, 1, 0, 0, 0, 80, 506, 1, 0, 0, 0, 82, 514, 1, 0, 0, 0, 84, 517, 1, 0, 0, 0, 86, 520, 1, 0, 0, 0, 88, 537, 1, 0, 0, 0, 90, 539, 1, 0, 0, 0, 92, 545, 1, 0, 0, 0, 94, 553, 1, 0, 0, 0, 96, 559, 1, 0, 0, 0, 98, 561, 1, 0, 0, 0, 100, 571, 1, 0, 0, 0, 102, 574, 1, 0, 0, 0, 104, 577, 1, 0, 0, 0, 106, 581, 1, 0, 0, 0, 108, 584, 1, 0, 0, 0, 110, 601, 1, 0, 0, 0, 112, 606, 1, 0, 0, 0, 114, 610, 1, 0, 0, 0, 116, 613, 1, 0, 0, 0, 118, 628, 1, 0, 0, 0, 120, 630, 1, 0, 0, 0, 122, 634, 1, 0, 0, 0, 124, 638, 1, 0, 0, 0, 126, 642, 1, 0, 0, 0, 128, 653, 1, 0, 0, 0, 130, 655, 1, 0, 0, 0, 132, 666, 1, 0, 0, 0, 134, 688, 1, 0, 0, 0, 136, 690, 1, 0, 0, 0, 138, 711, 1, 0, 0, 0, 140, 713, 1, 0, 0, 0, 142, 721, 1, 0, 0, 0, 144, 723, 1, 0, 0, 0, 146, 725, 1, 0, 0, 0, 148, 730, 1, 0, 0, 0, 150, 733, 1, 0, 0, 0, 152, 738, 1, 0, 0, 0, 154, 743, 1, 0, 0, 0, 156, 747, 1, 0, 0, 0, 158, 753, 1, 0, 0, 0, 160, 765, 1, 0, 0, 0, 162, 796, 1, 0, 0, 0, 164, 855, 1, 0, 0, 0, 166, 857, 1, 0, 0, 0, 168, 870, 1, 0, 0, 0, 170, 876, 1, 0, 0, 0, 172, 897, 1, 0, 0, 0, 174, 907, 1, 0, 0, 0, 176, 929, 1, 0, 0, 0, 178, 931, 1, 0, 0, 0, 180, 944, 1, 0, 0, 0, 182, 950, 1, 0, 0, 0, 184, 994, 1, 0, 0, 0, 186, 996, 1, 0, 0, 0, 188, 1000, 1, 0, 0, 0, 190, 1003, 1, 0, 0, 0, 192, 1008, 1, 0, 0, 0, 194, 1012, 1, 0, 0, 0, 196, 1014, 1, 0, 0, 0, 198, 1016, 1, 0, 0, 0, 200, 1029, 1, 0, 0, 0, 202, 1031, 1, 0, 0, 0, 204, 1100, 1, 0, 0, 0, 206, 1102, 1, 0, 0, 0, 208, 1104, 1, 0, 0, 0, 210, 1108, 1, 0, 0, 0, 212, 1120, 1, 0, 0, 0, 214, 1122, 1, 0, 0, 0, 216, 1137, 1, 0, 0, 0, 218, 1148, 1, 0, 0, 0, 220, 1150, 1, 0, 0, 0, 222, 1152, 1, 0, 0, 0, 224, 1154, 1, 0, 0, 0, 226, 1156, 1, 0, 0, 0, 228, 230, 3, 154, 77, 0, 229, 228, 1, 0, 0, 0, 230, 233, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 234, 1, 0, 0, 0, 233, 231, 1, 0, 0, 0, 234, 235, 3, 2, 1, 0, 235, 236, 5, 0, 0, 1, 236, 1, 1, 0, 0, 0, 237, 238, 3, 4, 2, 0, 238, 239, 5, 0, 0, 1, 239, 3, 1, 0, 0, 0, 240, 241, 6, 2, -1, 0, 241, 242, 3, 6, 3, 0, 242, 248, 1, 0, 0, 0, 243, 244, 10, 1, 0, 0, 244, 245, 5, 57, 0, 0, 245, 247, 3, 8, 4, 0, 246, 243, 1, 0, 0, 0, 247, 250, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 5, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 261, 3, 20, 10, 0, 252, 261, 3, 14, 7, 0, 253, 261, 3, 106, 53, 0, 254, 261, 3, 22, 11, 0, 255, 261, 3, 204, 102, 0, 256, 257, 4, 3, 1, 0, 257, 261, 3, 102, 51, 0, 258, 259, 4, 3, 2, 0, 259, 261, 3, 24, 12, 0, 260, 251, 1, 0, 0, 0, 260, 252, 1, 0, 0, 0, 260, 253, 1, 0, 0, 0, 260, 254, 1, 0, 0, 0, 260, 255, 1, 0, 0, 0, 260, 256, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 261, 7, 1, 0, 0, 0, 262, 292, 3, 44, 22, 0, 263, 292, 3, 10, 5, 0, 264, 292, 3, 82, 41, 0, 265, 292, 3, 74, 37, 0, 266, 292, 3, 46, 23, 0, 267, 292, 3, 78, 39, 0, 268, 292, 3, 84, 42, 0, 269, 292, 3, 86, 43, 0, 270, 292, 3, 90, 45, 0, 271, 292, 3, 98, 49, 0, 272, 292, 3, 108, 54, 0, 273, 292, 3, 100, 50, 0, 274, 292, 3, 198, 99, 0, 275, 292, 3, 116, 58, 0, 276, 292, 3, 132, 66, 0, 277, 292, 3, 114, 57, 0, 278, 292, 3, 120, 60, 0, 279, 292, 3, 130, 65, 0, 280, 292, 3, 134, 67, 0, 281, 292, 3, 136, 68, 0, 282, 292, 3, 150, 75, 0, 283, 292, 3, 142, 71, 0, 284, 292, 3, 152, 76, 0, 285, 292, 3, 144, 72, 0, 286, 292, 3, 158, 79, 0, 287, 288, 4, 4, 3, 0, 288, 292, 3, 146, 73, 0, 289, 290, 4, 4, 4, 0, 290, 292, 3, 148, 74, 0, 291, 262, 1, 0, 0, 0, 291, 263, 1, 0, 0, 0, 291, 264, 1, 0, 0, 0, 291, 265, 1, 0, 0, 0, 291, 266, 1, 0, 0, 0, 291, 267, 1, 0, 0, 0, 291, 268, 1, 0, 0, 0, 291, 269, 1, 0, 0, 0, 291, 270, 1, 0, 0, 0, 291, 271, 1, 0, 0, 0, 291, 272, 1, 0, 0, 0, 291, 273, 1, 0, 0, 0, 291, 274, 1, 0, 0, 0, 291, 275, 1, 0, 0, 0, 291, 276, 1, 0, 0, 0, 291, 277, 1, 0, 0, 0, 291, 278, 1, 0, 0, 0, 291, 279, 1, 0, 0, 0, 291, 280, 1, 0, 0, 0, 291, 281, 1, 0, 0, 0, 291, 282, 1, 0, 0, 0, 291, 283, 1, 0, 0, 0, 291, 284, 1, 0, 0, 0, 291, 285, 1, 0, 0, 0, 291, 286, 1, 0, 0, 0, 291, 287, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 292, 9, 1, 0, 0, 0, 293, 294, 5, 17, 0, 0, 294, 295, 3, 162, 81, 0, 295, 11, 1, 0, 0, 0, 296, 297, 3, 62, 31, 0, 297, 13, 1, 0, 0, 0, 298, 299, 5, 13, 0, 0, 299, 300, 3, 16, 8, 0, 300, 15, 1, 0, 0, 0, 301, 306, 3, 18, 9, 0, 302, 303, 5, 68, 0, 0, 303, 305, 3, 18, 9, 0, 304, 302, 1, 0, 0, 0, 305, 308, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 17, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 309, 310, 3, 52, 26, 0, 310, 311, 5, 63, 0, 0, 311, 313, 1, 0, 0, 0, 312, 309, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 315, 3, 162, 81, 0, 315, 19, 1, 0, 0, 0, 316, 317, 5, 22, 0, 0, 317, 318, 3, 26, 13, 0, 318, 21, 1, 0, 0, 0, 319, 320, 5, 23, 0, 0, 320, 321, 3, 26, 13, 0, 321, 23, 1, 0, 0, 0, 322, 323, 5, 24, 0, 0, 323, 324, 3, 72, 36, 0, 324, 325, 3, 96, 48, 0, 325, 25, 1, 0, 0, 0, 326, 331, 3, 28, 14, 0, 327, 328, 5, 68, 0, 0, 328, 330, 3, 28, 14, 0, 329, 327, 1, 0, 0, 0, 330, 333, 1, 0, 0, 0, 331, 329, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 335, 1, 0, 0, 0, 333, 331, 1, 0, 0, 0, 334, 336, 3, 42, 21, 0, 335, 334, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 27, 1, 0, 0, 0, 337, 340, 3, 32, 16, 0, 338, 340, 3, 30, 15, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 29, 1, 0, 0, 0, 341, 342, 5, 105, 0, 0, 342, 347, 3, 20, 10, 0, 343, 344, 5, 57, 0, 0, 344, 346, 3, 8, 4, 0, 345, 343, 1, 0, 0, 0, 346, 349, 1, 0, 0, 0, 347, 345, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 350, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 350, 351, 5, 106, 0, 0, 351, 31, 1, 0, 0, 0, 352, 353, 3, 34, 17, 0, 353, 354, 5, 66, 0, 0, 354, 356, 1, 0, 0, 0, 355, 352, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 360, 3, 38, 19, 0, 358, 359, 5, 65, 0, 0, 359, 361, 3, 36, 18, 0, 360, 358, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 364, 1, 0, 0, 0, 362, 364, 3, 40, 20, 0, 363, 355, 1, 0, 0, 0, 363, 362, 1, 0, 0, 0, 364, 33, 1, 0, 0, 0, 365, 366, 5, 113, 0, 0, 366, 35, 1, 0, 0, 0, 367, 368, 5, 113, 0, 0, 368, 37, 1, 0, 0, 0, 369, 370, 5, 113, 0, 0, 370, 39, 1, 0, 0, 0, 371, 372, 7, 0, 0, 0, 372, 41, 1, 0, 0, 0, 373, 374, 5, 112, 0, 0, 374, 379, 5, 113, 0, 0, 375, 376, 5, 68, 0, 0, 376, 378, 5, 113, 0, 0, 377, 375, 1, 0, 0, 0, 378, 381, 1, 0, 0, 0, 379, 377, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 43, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 382, 383, 5, 9, 0, 0, 383, 384, 3, 16, 8, 0, 384, 45, 1, 0, 0, 0, 385, 387, 5, 16, 0, 0, 386, 388, 3, 48, 24, 0, 387, 386, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 390, 5, 64, 0, 0, 390, 392, 3, 16, 8, 0, 391, 389, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 47, 1, 0, 0, 0, 393, 398, 3, 50, 25, 0, 394, 395, 5, 68, 0, 0, 395, 397, 3, 50, 25, 0, 396, 394, 1, 0, 0, 0, 397, 400, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 49, 1, 0, 0, 0, 400, 398, 1, 0, 0, 0, 401, 404, 3, 18, 9, 0, 402, 403, 5, 17, 0, 0, 403, 405, 3, 162, 81, 0, 404, 402, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 51, 1, 0, 0, 0, 406, 407, 4, 26, 5, 0, 407, 409, 5, 103, 0, 0, 408, 410, 5, 107, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 5, 104, 0, 0, 412, 413, 5, 70, 0, 0, 413, 414, 5, 103, 0, 0, 414, 415, 3, 54, 27, 0, 415, 416, 5, 104, 0, 0, 416, 419, 1, 0, 0, 0, 417, 419, 3, 54, 27, 0, 418, 406, 1, 0, 0, 0, 418, 417, 1, 0, 0, 0, 419, 53, 1, 0, 0, 0, 420, 425, 3, 70, 35, 0, 421, 422, 5, 70, 0, 0, 422, 424, 3, 70, 35, 0, 423, 421, 1, 0, 0, 0, 424, 427, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 55, 1, 0, 0, 0, 427, 425, 1, 0, 0, 0, 428, 429, 4, 28, 6, 0, 429, 431, 5, 103, 0, 0, 430, 432, 5, 148, 0, 0, 431, 430, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 5, 104, 0, 0, 434, 435, 5, 70, 0, 0, 435, 436, 5, 103, 0, 0, 436, 437, 3, 58, 29, 0, 437, 438, 5, 104, 0, 0, 438, 441, 1, 0, 0, 0, 439, 441, 3, 58, 29, 0, 440, 428, 1, 0, 0, 0, 440, 439, 1, 0, 0, 0, 441, 57, 1, 0, 0, 0, 442, 447, 3, 64, 32, 0, 443, 444, 5, 70, 0, 0, 444, 446, 3, 64, 32, 0, 445, 443, 1, 0, 0, 0, 446, 449, 1, 0, 0, 0, 447, 445, 1, 0, 0, 0, 447, 448, 1, 0, 0, 0, 448, 59, 1, 0, 0, 0, 449, 447, 1, 0, 0, 0, 450, 455, 3, 56, 28, 0, 451, 452, 5, 68, 0, 0, 452, 454, 3, 56, 28, 0, 453, 451, 1, 0, 0, 0, 454, 457, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 61, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 458, 459, 7, 1, 0, 0, 459, 63, 1, 0, 0, 0, 460, 464, 5, 148, 0, 0, 461, 464, 3, 66, 33, 0, 462, 464, 3, 68, 34, 0, 463, 460, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 463, 462, 1, 0, 0, 0, 464, 65, 1, 0, 0, 0, 465, 468, 5, 82, 0, 0, 466, 468, 5, 101, 0, 0, 467, 465, 1, 0, 0, 0, 467, 466, 1, 0, 0, 0, 468, 67, 1, 0, 0, 0, 469, 472, 5, 100, 0, 0, 470, 472, 5, 102, 0, 0, 471, 469, 1, 0, 0, 0, 471, 470, 1, 0, 0, 0, 472, 69, 1, 0, 0, 0, 473, 477, 3, 62, 31, 0, 474, 477, 3, 66, 33, 0, 475, 477, 3, 68, 34, 0, 476, 473, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 476, 475, 1, 0, 0, 0, 477, 71, 1, 0, 0, 0, 478, 481, 3, 194, 97, 0, 479, 481, 3, 66, 33, 0, 480, 478, 1, 0, 0, 0, 480, 479, 1, 0, 0, 0, 481, 73, 1, 0, 0, 0, 482, 483, 5, 11, 0, 0, 483, 485, 3, 184, 92, 0, 484, 486, 3, 76, 38, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 75, 1, 0, 0, 0, 487, 488, 4, 38, 7, 0, 488, 489, 5, 64, 0, 0, 489, 494, 3, 162, 81, 0, 490, 491, 5, 68, 0, 0, 491, 493, 3, 162, 81, 0, 492, 490, 1, 0, 0, 0, 493, 496, 1, 0, 0, 0, 494, 492, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 77, 1, 0, 0, 0, 496, 494, 1, 0, 0, 0, 497, 498, 5, 15, 0, 0, 498, 503, 3, 80, 40, 0, 499, 500, 5, 68, 0, 0, 500, 502, 3, 80, 40, 0, 501, 499, 1, 0, 0, 0, 502, 505, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 79, 1, 0, 0, 0, 505, 503, 1, 0, 0, 0, 506, 508, 3, 162, 81, 0, 507, 509, 7, 2, 0, 0, 508, 507, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 512, 1, 0, 0, 0, 510, 511, 5, 79, 0, 0, 511, 513, 7, 3, 0, 0, 512, 510, 1, 0, 0, 0, 512, 513, 1, 0, 0, 0, 513, 81, 1, 0, 0, 0, 514, 515, 5, 37, 0, 0, 515, 516, 3, 60, 30, 0, 516, 83, 1, 0, 0, 0, 517, 518, 5, 36, 0, 0, 518, 519, 3, 60, 30, 0, 519, 85, 1, 0, 0, 0, 520, 521, 5, 40, 0, 0, 521, 526, 3, 88, 44, 0, 522, 523, 5, 68, 0, 0, 523, 525, 3, 88, 44, 0, 524, 522, 1, 0, 0, 0, 525, 528, 1, 0, 0, 0, 526, 524, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 87, 1, 0, 0, 0, 528, 526, 1, 0, 0, 0, 529, 530, 3, 56, 28, 0, 530, 531, 5, 158, 0, 0, 531, 532, 3, 56, 28, 0, 532, 538, 1, 0, 0, 0, 533, 534, 3, 56, 28, 0, 534, 535, 5, 63, 0, 0, 535, 536, 3, 56, 28, 0, 536, 538, 1, 0, 0, 0, 537, 529, 1, 0, 0, 0, 537, 533, 1, 0, 0, 0, 538, 89, 1, 0, 0, 0, 539, 540, 5, 8, 0, 0, 540, 541, 3, 172, 86, 0, 541, 543, 3, 194, 97, 0, 542, 544, 3, 92, 46, 0, 543, 542, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 91, 1, 0, 0, 0, 545, 550, 3, 94, 47, 0, 546, 547, 5, 68, 0, 0, 547, 549, 3, 94, 47, 0, 548, 546, 1, 0, 0, 0, 549, 552, 1, 0, 0, 0, 550, 548, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 93, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 553, 554, 3, 62, 31, 0, 554, 555, 5, 63, 0, 0, 555, 556, 3, 184, 92, 0, 556, 95, 1, 0, 0, 0, 557, 558, 5, 85, 0, 0, 558, 560, 3, 178, 89, 0, 559, 557, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 97, 1, 0, 0, 0, 561, 562, 5, 10, 0, 0, 562, 563, 3, 172, 86, 0, 563, 568, 3, 194, 97, 0, 564, 565, 5, 68, 0, 0, 565, 567, 3, 194, 97, 0, 566, 564, 1, 0, 0, 0, 567, 570, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 99, 1, 0, 0, 0, 570, 568, 1, 0, 0, 0, 571, 572, 5, 35, 0, 0, 572, 573, 3, 52, 26, 0, 573, 101, 1, 0, 0, 0, 574, 575, 5, 6, 0, 0, 575, 576, 3, 104, 52, 0, 576, 103, 1, 0, 0, 0, 577, 578, 5, 105, 0, 0, 578, 579, 3, 4, 2, 0, 579, 580, 5, 106, 0, 0, 580, 105, 1, 0, 0, 0, 581, 582, 5, 42, 0, 0, 582, 583, 5, 165, 0, 0, 583, 107, 1, 0, 0, 0, 584, 585, 5, 5, 0, 0, 585, 588, 3, 110, 55, 0, 586, 587, 5, 80, 0, 0, 587, 589, 3, 56, 28, 0, 588, 586, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 599, 1, 0, 0, 0, 590, 591, 5, 85, 0, 0, 591, 596, 3, 112, 56, 0, 592, 593, 5, 68, 0, 0, 593, 595, 3, 112, 56, 0, 594, 592, 1, 0, 0, 0, 595, 598, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 600, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 599, 590, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 109, 1, 0, 0, 0, 601, 602, 7, 4, 0, 0, 602, 111, 1, 0, 0, 0, 603, 604, 3, 56, 28, 0, 604, 605, 5, 63, 0, 0, 605, 607, 1, 0, 0, 0, 606, 603, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 609, 3, 56, 28, 0, 609, 113, 1, 0, 0, 0, 610, 611, 5, 14, 0, 0, 611, 612, 3, 184, 92, 0, 612, 115, 1, 0, 0, 0, 613, 614, 5, 4, 0, 0, 614, 618, 3, 52, 26, 0, 615, 617, 3, 118, 59, 0, 616, 615, 1, 0, 0, 0, 617, 620, 1, 0, 0, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 117, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 621, 622, 5, 80, 0, 0, 622, 629, 3, 52, 26, 0, 623, 624, 5, 158, 0, 0, 624, 625, 3, 52, 26, 0, 625, 626, 5, 68, 0, 0, 626, 627, 3, 52, 26, 0, 627, 629, 1, 0, 0, 0, 628, 621, 1, 0, 0, 0, 628, 623, 1, 0, 0, 0, 629, 119, 1, 0, 0, 0, 630, 631, 5, 25, 0, 0, 631, 632, 3, 122, 61, 0, 632, 121, 1, 0, 0, 0, 633, 635, 3, 124, 62, 0, 634, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 634, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 123, 1, 0, 0, 0, 638, 639, 5, 105, 0, 0, 639, 640, 3, 126, 63, 0, 640, 641, 5, 106, 0, 0, 641, 125, 1, 0, 0, 0, 642, 643, 6, 63, -1, 0, 643, 644, 3, 128, 64, 0, 644, 650, 1, 0, 0, 0, 645, 646, 10, 1, 0, 0, 646, 647, 5, 57, 0, 0, 647, 649, 3, 128, 64, 0, 648, 645, 1, 0, 0, 0, 649, 652, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 127, 1, 0, 0, 0, 652, 650, 1, 0, 0, 0, 653, 654, 3, 8, 4, 0, 654, 129, 1, 0, 0, 0, 655, 659, 5, 12, 0, 0, 656, 657, 3, 52, 26, 0, 657, 658, 5, 63, 0, 0, 658, 660, 1, 0, 0, 0, 659, 656, 1, 0, 0, 0, 659, 660, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 662, 3, 184, 92, 0, 662, 663, 5, 80, 0, 0, 663, 664, 3, 16, 8, 0, 664, 665, 3, 96, 48, 0, 665, 131, 1, 0, 0, 0, 666, 670, 5, 7, 0, 0, 667, 668, 3, 52, 26, 0, 668, 669, 5, 63, 0, 0, 669, 671, 1, 0, 0, 0, 670, 667, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 3, 172, 86, 0, 673, 674, 3, 96, 48, 0, 674, 133, 1, 0, 0, 0, 675, 676, 5, 27, 0, 0, 676, 677, 5, 126, 0, 0, 677, 680, 3, 48, 24, 0, 678, 679, 5, 64, 0, 0, 679, 681, 3, 16, 8, 0, 680, 678, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 689, 1, 0, 0, 0, 682, 683, 5, 28, 0, 0, 683, 686, 3, 48, 24, 0, 684, 685, 5, 64, 0, 0, 685, 687, 3, 16, 8, 0, 686, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 675, 1, 0, 0, 0, 688, 682, 1, 0, 0, 0, 689, 135, 1, 0, 0, 0, 690, 692, 5, 26, 0, 0, 691, 693, 3, 62, 31, 0, 692, 691, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 697, 1, 0, 0, 0, 694, 696, 3, 138, 69, 0, 695, 694, 1, 0, 0, 0, 696, 699, 1, 0, 0, 0, 697, 695, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 137, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 700, 701, 5, 121, 0, 0, 701, 702, 5, 64, 0, 0, 702, 712, 3, 52, 26, 0, 703, 704, 5, 122, 0, 0, 704, 705, 5, 64, 0, 0, 705, 712, 3, 140, 70, 0, 706, 707, 5, 120, 0, 0, 707, 708, 5, 64, 0, 0, 708, 712, 3, 52, 26, 0, 709, 710, 5, 85, 0, 0, 710, 712, 3, 178, 89, 0, 711, 700, 1, 0, 0, 0, 711, 703, 1, 0, 0, 0, 711, 706, 1, 0, 0, 0, 711, 709, 1, 0, 0, 0, 712, 139, 1, 0, 0, 0, 713, 718, 3, 52, 26, 0, 714, 715, 5, 68, 0, 0, 715, 717, 3, 52, 26, 0, 716, 714, 1, 0, 0, 0, 717, 720, 1, 0, 0, 0, 718, 716, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 141, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 721, 722, 5, 19, 0, 0, 722, 143, 1, 0, 0, 0, 723, 724, 5, 21, 0, 0, 724, 145, 1, 0, 0, 0, 725, 726, 5, 33, 0, 0, 726, 727, 3, 32, 16, 0, 727, 728, 5, 80, 0, 0, 728, 729, 3, 60, 30, 0, 729, 147, 1, 0, 0, 0, 730, 731, 5, 38, 0, 0, 731, 732, 3, 60, 30, 0, 732, 149, 1, 0, 0, 0, 733, 734, 5, 18, 0, 0, 734, 735, 3, 52, 26, 0, 735, 736, 5, 63, 0, 0, 736, 737, 3, 172, 86, 0, 737, 151, 1, 0, 0, 0, 738, 739, 5, 20, 0, 0, 739, 740, 3, 52, 26, 0, 740, 741, 5, 63, 0, 0, 741, 742, 3, 172, 86, 0, 742, 153, 1, 0, 0, 0, 743, 744, 5, 41, 0, 0, 744, 745, 3, 156, 78, 0, 745, 746, 5, 67, 0, 0, 746, 155, 1, 0, 0, 0, 747, 748, 3, 62, 31, 0, 748, 751, 5, 63, 0, 0, 749, 752, 3, 184, 92, 0, 750, 752, 3, 178, 89, 0, 751, 749, 1, 0, 0, 0, 751, 750, 1, 0, 0, 0, 752, 157, 1, 0, 0, 0, 753, 755, 5, 34, 0, 0, 754, 756, 3, 160, 80, 0, 755, 754, 1, 0, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 757, 758, 5, 80, 0, 0, 758, 759, 3, 52, 26, 0, 759, 760, 5, 141, 0, 0, 760, 761, 3, 192, 96, 0, 761, 762, 3, 96, 48, 0, 762, 159, 1, 0, 0, 0, 763, 766, 3, 66, 33, 0, 764, 766, 3, 172, 86, 0, 765, 763, 1, 0, 0, 0, 765, 764, 1, 0, 0, 0, 766, 161, 1, 0, 0, 0, 767, 768, 6, 81, -1, 0, 768, 769, 5, 77, 0, 0, 769, 797, 3, 162, 81, 8, 770, 797, 3, 168, 84, 0, 771, 797, 3, 164, 82, 0, 772, 774, 3, 168, 84, 0, 773, 775, 5, 77, 0, 0, 774, 773, 1, 0, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 777, 5, 73, 0, 0, 777, 778, 5, 105, 0, 0, 778, 783, 3, 168, 84, 0, 779, 780, 5, 68, 0, 0, 780, 782, 3, 168, 84, 0, 781, 779, 1, 0, 0, 0, 782, 785, 1, 0, 0, 0, 783, 781, 1, 0, 0, 0, 783, 784, 1, 0, 0, 0, 784, 786, 1, 0, 0, 0, 785, 783, 1, 0, 0, 0, 786, 787, 5, 106, 0, 0, 787, 797, 1, 0, 0, 0, 788, 789, 3, 168, 84, 0, 789, 791, 5, 74, 0, 0, 790, 792, 5, 77, 0, 0, 791, 790, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 793, 1, 0, 0, 0, 793, 794, 5, 78, 0, 0, 794, 797, 1, 0, 0, 0, 795, 797, 3, 166, 83, 0, 796, 767, 1, 0, 0, 0, 796, 770, 1, 0, 0, 0, 796, 771, 1, 0, 0, 0, 796, 772, 1, 0, 0, 0, 796, 788, 1, 0, 0, 0, 796, 795, 1, 0, 0, 0, 797, 806, 1, 0, 0, 0, 798, 799, 10, 5, 0, 0, 799, 800, 5, 61, 0, 0, 800, 805, 3, 162, 81, 6, 801, 802, 10, 4, 0, 0, 802, 803, 5, 81, 0, 0, 803, 805, 3, 162, 81, 5, 804, 798, 1, 0, 0, 0, 804, 801, 1, 0, 0, 0, 805, 808, 1, 0, 0, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 163, 1, 0, 0, 0, 808, 806, 1, 0, 0, 0, 809, 811, 3, 168, 84, 0, 810, 812, 5, 77, 0, 0, 811, 810, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 5, 76, 0, 0, 814, 815, 3, 72, 36, 0, 815, 856, 1, 0, 0, 0, 816, 818, 3, 168, 84, 0, 817, 819, 5, 77, 0, 0, 818, 817, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 820, 1, 0, 0, 0, 820, 821, 5, 83, 0, 0, 821, 822, 3, 72, 36, 0, 822, 856, 1, 0, 0, 0, 823, 825, 3, 168, 84, 0, 824, 826, 5, 77, 0, 0, 825, 824, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 827, 1, 0, 0, 0, 827, 828, 5, 76, 0, 0, 828, 829, 5, 105, 0, 0, 829, 834, 3, 72, 36, 0, 830, 831, 5, 68, 0, 0, 831, 833, 3, 72, 36, 0, 832, 830, 1, 0, 0, 0, 833, 836, 1, 0, 0, 0, 834, 832, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 1, 0, 0, 0, 836, 834, 1, 0, 0, 0, 837, 838, 5, 106, 0, 0, 838, 856, 1, 0, 0, 0, 839, 841, 3, 168, 84, 0, 840, 842, 5, 77, 0, 0, 841, 840, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 844, 5, 83, 0, 0, 844, 845, 5, 105, 0, 0, 845, 850, 3, 72, 36, 0, 846, 847, 5, 68, 0, 0, 847, 849, 3, 72, 36, 0, 848, 846, 1, 0, 0, 0, 849, 852, 1, 0, 0, 0, 850, 848, 1, 0, 0, 0, 850, 851, 1, 0, 0, 0, 851, 853, 1, 0, 0, 0, 852, 850, 1, 0, 0, 0, 853, 854, 5, 106, 0, 0, 854, 856, 1, 0, 0, 0, 855, 809, 1, 0, 0, 0, 855, 816, 1, 0, 0, 0, 855, 823, 1, 0, 0, 0, 855, 839, 1, 0, 0, 0, 856, 165, 1, 0, 0, 0, 857, 860, 3, 52, 26, 0, 858, 859, 5, 65, 0, 0, 859, 861, 3, 12, 6, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 5, 66, 0, 0, 863, 864, 3, 184, 92, 0, 864, 167, 1, 0, 0, 0, 865, 871, 3, 170, 85, 0, 866, 867, 3, 170, 85, 0, 867, 868, 3, 196, 98, 0, 868, 869, 3, 170, 85, 0, 869, 871, 1, 0, 0, 0, 870, 865, 1, 0, 0, 0, 870, 866, 1, 0, 0, 0, 871, 169, 1, 0, 0, 0, 872, 873, 6, 85, -1, 0, 873, 877, 3, 172, 86, 0, 874, 875, 7, 5, 0, 0, 875, 877, 3, 170, 85, 3, 876, 872, 1, 0, 0, 0, 876, 874, 1, 0, 0, 0, 877, 886, 1, 0, 0, 0, 878, 879, 10, 2, 0, 0, 879, 880, 7, 6, 0, 0, 880, 885, 3, 170, 85, 3, 881, 882, 10, 1, 0, 0, 882, 883, 7, 5, 0, 0, 883, 885, 3, 170, 85, 2, 884, 878, 1, 0, 0, 0, 884, 881, 1, 0, 0, 0, 885, 888, 1, 0, 0, 0, 886, 884, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 171, 1, 0, 0, 0, 888, 886, 1, 0, 0, 0, 889, 890, 6, 86, -1, 0, 890, 898, 3, 184, 92, 0, 891, 898, 3, 52, 26, 0, 892, 898, 3, 174, 87, 0, 893, 894, 5, 105, 0, 0, 894, 895, 3, 162, 81, 0, 895, 896, 5, 106, 0, 0, 896, 898, 1, 0, 0, 0, 897, 889, 1, 0, 0, 0, 897, 891, 1, 0, 0, 0, 897, 892, 1, 0, 0, 0, 897, 893, 1, 0, 0, 0, 898, 904, 1, 0, 0, 0, 899, 900, 10, 1, 0, 0, 900, 901, 5, 65, 0, 0, 901, 903, 3, 12, 6, 0, 902, 899, 1, 0, 0, 0, 903, 906, 1, 0, 0, 0, 904, 902, 1, 0, 0, 0, 904, 905, 1, 0, 0, 0, 905, 173, 1, 0, 0, 0, 906, 904, 1, 0, 0, 0, 907, 908, 3, 176, 88, 0, 908, 922, 5, 105, 0, 0, 909, 923, 5, 95, 0, 0, 910, 915, 3, 162, 81, 0, 911, 912, 5, 68, 0, 0, 912, 914, 3, 162, 81, 0, 913, 911, 1, 0, 0, 0, 914, 917, 1, 0, 0, 0, 915, 913, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 920, 1, 0, 0, 0, 917, 915, 1, 0, 0, 0, 918, 919, 5, 68, 0, 0, 919, 921, 3, 178, 89, 0, 920, 918, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 923, 1, 0, 0, 0, 922, 909, 1, 0, 0, 0, 922, 910, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 1, 0, 0, 0, 924, 925, 5, 106, 0, 0, 925, 175, 1, 0, 0, 0, 926, 930, 3, 70, 35, 0, 927, 930, 5, 72, 0, 0, 928, 930, 5, 75, 0, 0, 929, 926, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 929, 928, 1, 0, 0, 0, 930, 177, 1, 0, 0, 0, 931, 940, 5, 98, 0, 0, 932, 937, 3, 180, 90, 0, 933, 934, 5, 68, 0, 0, 934, 936, 3, 180, 90, 0, 935, 933, 1, 0, 0, 0, 936, 939, 1, 0, 0, 0, 937, 935, 1, 0, 0, 0, 937, 938, 1, 0, 0, 0, 938, 941, 1, 0, 0, 0, 939, 937, 1, 0, 0, 0, 940, 932, 1, 0, 0, 0, 940, 941, 1, 0, 0, 0, 941, 942, 1, 0, 0, 0, 942, 943, 5, 99, 0, 0, 943, 179, 1, 0, 0, 0, 944, 945, 3, 194, 97, 0, 945, 946, 5, 66, 0, 0, 946, 947, 3, 182, 91, 0, 947, 181, 1, 0, 0, 0, 948, 951, 3, 184, 92, 0, 949, 951, 3, 178, 89, 0, 950, 948, 1, 0, 0, 0, 950, 949, 1, 0, 0, 0, 951, 183, 1, 0, 0, 0, 952, 995, 5, 78, 0, 0, 953, 954, 3, 192, 96, 0, 954, 955, 5, 107, 0, 0, 955, 995, 1, 0, 0, 0, 956, 995, 3, 190, 95, 0, 957, 995, 3, 192, 96, 0, 958, 995, 3, 186, 93, 0, 959, 995, 3, 66, 33, 0, 960, 995, 3, 194, 97, 0, 961, 962, 5, 103, 0, 0, 962, 967, 3, 188, 94, 0, 963, 964, 5, 68, 0, 0, 964, 966, 3, 188, 94, 0, 965, 963, 1, 0, 0, 0, 966, 969, 1, 0, 0, 0, 967, 965, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 970, 1, 0, 0, 0, 969, 967, 1, 0, 0, 0, 970, 971, 5, 104, 0, 0, 971, 995, 1, 0, 0, 0, 972, 973, 5, 103, 0, 0, 973, 978, 3, 186, 93, 0, 974, 975, 5, 68, 0, 0, 975, 977, 3, 186, 93, 0, 976, 974, 1, 0, 0, 0, 977, 980, 1, 0, 0, 0, 978, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 981, 1, 0, 0, 0, 980, 978, 1, 0, 0, 0, 981, 982, 5, 104, 0, 0, 982, 995, 1, 0, 0, 0, 983, 984, 5, 103, 0, 0, 984, 989, 3, 194, 97, 0, 985, 986, 5, 68, 0, 0, 986, 988, 3, 194, 97, 0, 987, 985, 1, 0, 0, 0, 988, 991, 1, 0, 0, 0, 989, 987, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 992, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 992, 993, 5, 104, 0, 0, 993, 995, 1, 0, 0, 0, 994, 952, 1, 0, 0, 0, 994, 953, 1, 0, 0, 0, 994, 956, 1, 0, 0, 0, 994, 957, 1, 0, 0, 0, 994, 958, 1, 0, 0, 0, 994, 959, 1, 0, 0, 0, 994, 960, 1, 0, 0, 0, 994, 961, 1, 0, 0, 0, 994, 972, 1, 0, 0, 0, 994, 983, 1, 0, 0, 0, 995, 185, 1, 0, 0, 0, 996, 997, 7, 7, 0, 0, 997, 187, 1, 0, 0, 0, 998, 1001, 3, 190, 95, 0, 999, 1001, 3, 192, 96, 0, 1000, 998, 1, 0, 0, 0, 1000, 999, 1, 0, 0, 0, 1001, 189, 1, 0, 0, 0, 1002, 1004, 7, 5, 0, 0, 1003, 1002, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 5, 60, 0, 0, 1006, 191, 1, 0, 0, 0, 1007, 1009, 7, 5, 0, 0, 1008, 1007, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 5, 59, 0, 0, 1011, 193, 1, 0, 0, 0, 1012, 1013, 5, 58, 0, 0, 1013, 195, 1, 0, 0, 0, 1014, 1015, 7, 8, 0, 0, 1015, 197, 1, 0, 0, 0, 1016, 1017, 7, 9, 0, 0, 1017, 1018, 5, 130, 0, 0, 1018, 1019, 3, 200, 100, 0, 1019, 1020, 3, 202, 101, 0, 1020, 199, 1, 0, 0, 0, 1021, 1022, 4, 100, 14, 0, 1022, 1024, 3, 32, 16, 0, 1023, 1025, 5, 158, 0, 0, 1024, 1023, 1, 0, 0, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 5, 113, 0, 0, 1027, 1030, 1, 0, 0, 0, 1028, 1030, 3, 32, 16, 0, 1029, 1021, 1, 0, 0, 0, 1029, 1028, 1, 0, 0, 0, 1030, 201, 1, 0, 0, 0, 1031, 1032, 5, 80, 0, 0, 1032, 1037, 3, 162, 81, 0, 1033, 1034, 5, 68, 0, 0, 1034, 1036, 3, 162, 81, 0, 1035, 1033, 1, 0, 0, 0, 1036, 1039, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 203, 1, 0, 0, 0, 1039, 1037, 1, 0, 0, 0, 1040, 1044, 5, 39, 0, 0, 1041, 1043, 3, 208, 104, 0, 1042, 1041, 1, 0, 0, 0, 1043, 1046, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1050, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1047, 1048, 3, 206, 103, 0, 1048, 1049, 5, 63, 0, 0, 1049, 1051, 1, 0, 0, 0, 1050, 1047, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 5, 105, 0, 0, 1053, 1054, 5, 101, 0, 0, 1054, 1101, 5, 106, 0, 0, 1055, 1059, 5, 39, 0, 0, 1056, 1058, 3, 208, 104, 0, 1057, 1056, 1, 0, 0, 0, 1058, 1061, 1, 0, 0, 0, 1059, 1057, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1065, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1062, 1063, 3, 206, 103, 0, 1063, 1064, 5, 63, 0, 0, 1064, 1066, 1, 0, 0, 0, 1065, 1062, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1101, 5, 101, 0, 0, 1068, 1072, 5, 39, 0, 0, 1069, 1071, 3, 208, 104, 0, 1070, 1069, 1, 0, 0, 0, 1071, 1074, 1, 0, 0, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1078, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 3, 206, 103, 0, 1076, 1077, 5, 63, 0, 0, 1077, 1079, 1, 0, 0, 0, 1078, 1075, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1082, 5, 105, 0, 0, 1081, 1083, 3, 216, 108, 0, 1082, 1081, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1082, 1, 0, 0, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 5, 106, 0, 0, 1087, 1101, 1, 0, 0, 0, 1088, 1092, 5, 39, 0, 0, 1089, 1091, 3, 208, 104, 0, 1090, 1089, 1, 0, 0, 0, 1091, 1094, 1, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1095, 1097, 3, 216, 108, 0, 1096, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1096, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1101, 1, 0, 0, 0, 1100, 1040, 1, 0, 0, 0, 1100, 1055, 1, 0, 0, 0, 1100, 1068, 1, 0, 0, 0, 1100, 1088, 1, 0, 0, 0, 1101, 205, 1, 0, 0, 0, 1102, 1103, 7, 1, 0, 0, 1103, 207, 1, 0, 0, 0, 1104, 1105, 3, 210, 105, 0, 1105, 1106, 5, 63, 0, 0, 1106, 1107, 3, 212, 106, 0, 1107, 209, 1, 0, 0, 0, 1108, 1109, 7, 10, 0, 0, 1109, 211, 1, 0, 0, 0, 1110, 1115, 3, 218, 109, 0, 1111, 1112, 5, 68, 0, 0, 1112, 1114, 3, 218, 109, 0, 1113, 1111, 1, 0, 0, 0, 1114, 1117, 1, 0, 0, 0, 1115, 1113, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1121, 1, 0, 0, 0, 1117, 1115, 1, 0, 0, 0, 1118, 1121, 5, 108, 0, 0, 1119, 1121, 5, 101, 0, 0, 1120, 1110, 1, 0, 0, 0, 1120, 1118, 1, 0, 0, 0, 1120, 1119, 1, 0, 0, 0, 1121, 213, 1, 0, 0, 0, 1122, 1123, 7, 11, 0, 0, 1123, 215, 1, 0, 0, 0, 1124, 1126, 3, 214, 107, 0, 1125, 1124, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1125, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1138, 1, 0, 0, 0, 1129, 1133, 5, 105, 0, 0, 1130, 1132, 3, 216, 108, 0, 1131, 1130, 1, 0, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1136, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1136, 1138, 5, 106, 0, 0, 1137, 1125, 1, 0, 0, 0, 1137, 1129, 1, 0, 0, 0, 1138, 217, 1, 0, 0, 0, 1139, 1140, 3, 220, 110, 0, 1140, 1141, 5, 66, 0, 0, 1141, 1142, 3, 224, 112, 0, 1142, 1149, 1, 0, 0, 0, 1143, 1144, 3, 224, 112, 0, 1144, 1145, 5, 65, 0, 0, 1145, 1146, 3, 222, 111, 0, 1146, 1149, 1, 0, 0, 0, 1147, 1149, 3, 226, 113, 0, 1148, 1139, 1, 0, 0, 0, 1148, 1143, 1, 0, 0, 0, 1148, 1147, 1, 0, 0, 0, 1149, 219, 1, 0, 0, 0, 1150, 1151, 7, 12, 0, 0, 1151, 221, 1, 0, 0, 0, 1152, 1153, 7, 12, 0, 0, 1153, 223, 1, 0, 0, 0, 1154, 1155, 7, 12, 0, 0, 1155, 225, 1, 0, 0, 0, 1156, 1157, 7, 13, 0, 0, 1157, 227, 1, 0, 0, 0, 114, 231, 248, 260, 291, 306, 312, 331, 335, 339, 347, 355, 360, 363, 379, 387, 391, 398, 404, 409, 418, 425, 431, 440, 447, 455, 463, 467, 471, 476, 480, 485, 494, 503, 508, 512, 526, 537, 543, 550, 559, 568, 588, 596, 599, 606, 618, 628, 636, 650, 659, 670, 680, 686, 688, 692, 697, 711, 718, 751, 755, 765, 774, 783, 791, 796, 804, 806, 811, 818, 825, 834, 841, 850, 855, 860, 870, 876, 884, 886, 897, 904, 915, 920, 922, 929, 937, 940, 950, 967, 978, 989, 994, 1000, 1003, 1008, 1024, 1029, 1037, 1044, 1050, 1059, 1065, 1072, 1078, 1084, 1092, 1098, 1100, 1115, 1120, 1127, 1133, 1137, 1148] \ No newline at end of file +[4, 1, 169, 1168, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 1, 0, 5, 0, 232, 8, 0, 10, 0, 12, 0, 235, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 249, 8, 2, 10, 2, 12, 2, 252, 9, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 263, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 295, 8, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 5, 8, 308, 8, 8, 10, 8, 12, 8, 311, 9, 8, 1, 9, 1, 9, 1, 9, 3, 9, 316, 8, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 333, 8, 13, 10, 13, 12, 13, 336, 9, 13, 1, 13, 3, 13, 339, 8, 13, 1, 14, 1, 14, 3, 14, 343, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 349, 8, 15, 10, 15, 12, 15, 352, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 3, 16, 359, 8, 16, 1, 16, 1, 16, 1, 16, 3, 16, 364, 8, 16, 1, 16, 3, 16, 367, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 381, 8, 21, 10, 21, 12, 21, 384, 9, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 391, 8, 23, 1, 23, 1, 23, 3, 23, 395, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 400, 8, 24, 10, 24, 12, 24, 403, 9, 24, 1, 25, 1, 25, 1, 25, 3, 25, 408, 8, 25, 1, 26, 1, 26, 1, 26, 3, 26, 413, 8, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 422, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 427, 8, 27, 10, 27, 12, 27, 430, 9, 27, 1, 28, 1, 28, 1, 28, 3, 28, 435, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 444, 8, 28, 1, 29, 1, 29, 1, 29, 5, 29, 449, 8, 29, 10, 29, 12, 29, 452, 9, 29, 1, 30, 1, 30, 1, 30, 5, 30, 457, 8, 30, 10, 30, 12, 30, 460, 9, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 3, 32, 467, 8, 32, 1, 33, 1, 33, 3, 33, 471, 8, 33, 1, 34, 1, 34, 3, 34, 475, 8, 34, 1, 35, 1, 35, 1, 35, 3, 35, 480, 8, 35, 1, 36, 1, 36, 3, 36, 484, 8, 36, 1, 37, 1, 37, 1, 37, 3, 37, 489, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 496, 8, 38, 10, 38, 12, 38, 499, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 505, 8, 39, 10, 39, 12, 39, 508, 9, 39, 1, 40, 1, 40, 3, 40, 512, 8, 40, 1, 40, 1, 40, 3, 40, 516, 8, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 528, 8, 43, 10, 43, 12, 43, 531, 9, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 541, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 547, 8, 45, 1, 46, 1, 46, 1, 46, 5, 46, 552, 8, 46, 10, 46, 12, 46, 555, 9, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 3, 48, 563, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 570, 8, 49, 10, 49, 12, 49, 573, 9, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 592, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 598, 8, 54, 10, 54, 12, 54, 601, 9, 54, 3, 54, 603, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 3, 56, 610, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 620, 8, 58, 10, 58, 12, 58, 623, 9, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 632, 8, 59, 1, 60, 1, 60, 1, 60, 1, 61, 4, 61, 638, 8, 61, 11, 61, 12, 61, 639, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 652, 8, 63, 10, 63, 12, 63, 655, 9, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 663, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 674, 8, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 684, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 690, 8, 67, 3, 67, 692, 8, 67, 1, 68, 1, 68, 3, 68, 696, 8, 68, 1, 68, 5, 68, 699, 8, 68, 10, 68, 12, 68, 702, 9, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 715, 8, 69, 1, 70, 1, 70, 1, 70, 5, 70, 720, 8, 70, 10, 70, 12, 70, 723, 9, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 761, 8, 79, 1, 80, 1, 80, 3, 80, 765, 8, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 3, 81, 775, 8, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 784, 8, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 791, 8, 82, 10, 82, 12, 82, 794, 9, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 3, 82, 801, 8, 82, 1, 82, 1, 82, 1, 82, 3, 82, 806, 8, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 814, 8, 82, 10, 82, 12, 82, 817, 9, 82, 1, 83, 1, 83, 3, 83, 821, 8, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 828, 8, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 835, 8, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 5, 83, 842, 8, 83, 10, 83, 12, 83, 845, 9, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 851, 8, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 5, 83, 858, 8, 83, 10, 83, 12, 83, 861, 9, 83, 1, 83, 1, 83, 3, 83, 865, 8, 83, 1, 84, 1, 84, 1, 84, 3, 84, 870, 8, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 880, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 886, 8, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 5, 86, 894, 8, 86, 10, 86, 12, 86, 897, 9, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 3, 87, 907, 8, 87, 1, 87, 1, 87, 1, 87, 5, 87, 912, 8, 87, 10, 87, 12, 87, 915, 9, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 5, 88, 923, 8, 88, 10, 88, 12, 88, 926, 9, 88, 1, 88, 1, 88, 3, 88, 930, 8, 88, 3, 88, 932, 8, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 3, 89, 939, 8, 89, 1, 90, 1, 90, 1, 90, 1, 90, 5, 90, 945, 8, 90, 10, 90, 12, 90, 948, 9, 90, 3, 90, 950, 8, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 3, 92, 960, 8, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 5, 93, 975, 8, 93, 10, 93, 12, 93, 978, 9, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 5, 93, 986, 8, 93, 10, 93, 12, 93, 989, 9, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 5, 93, 997, 8, 93, 10, 93, 12, 93, 1000, 9, 93, 1, 93, 1, 93, 3, 93, 1004, 8, 93, 1, 94, 1, 94, 1, 95, 1, 95, 3, 95, 1010, 8, 95, 1, 96, 3, 96, 1013, 8, 96, 1, 96, 1, 96, 1, 97, 3, 97, 1018, 8, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 3, 101, 1034, 8, 101, 1, 101, 1, 101, 1, 101, 3, 101, 1039, 8, 101, 1, 102, 1, 102, 1, 102, 1, 102, 5, 102, 1045, 8, 102, 10, 102, 12, 102, 1048, 9, 102, 1, 103, 1, 103, 5, 103, 1052, 8, 103, 10, 103, 12, 103, 1055, 9, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1060, 8, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 5, 103, 1067, 8, 103, 10, 103, 12, 103, 1070, 9, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1075, 8, 103, 1, 103, 1, 103, 1, 103, 5, 103, 1080, 8, 103, 10, 103, 12, 103, 1083, 9, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1088, 8, 103, 1, 103, 1, 103, 4, 103, 1092, 8, 103, 11, 103, 12, 103, 1093, 1, 103, 1, 103, 1, 103, 1, 103, 5, 103, 1100, 8, 103, 10, 103, 12, 103, 1103, 9, 103, 1, 103, 4, 103, 1106, 8, 103, 11, 103, 12, 103, 1107, 3, 103, 1110, 8, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 5, 107, 1123, 8, 107, 10, 107, 12, 107, 1126, 9, 107, 1, 107, 1, 107, 3, 107, 1130, 8, 107, 1, 108, 1, 108, 1, 109, 4, 109, 1135, 8, 109, 11, 109, 12, 109, 1136, 1, 109, 1, 109, 5, 109, 1141, 8, 109, 10, 109, 12, 109, 1144, 9, 109, 1, 109, 3, 109, 1147, 8, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 3, 110, 1158, 8, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 0, 5, 4, 126, 164, 172, 174, 115, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 0, 14, 2, 0, 59, 59, 114, 114, 1, 0, 108, 109, 2, 0, 63, 63, 70, 70, 2, 0, 73, 73, 76, 76, 2, 0, 48, 48, 59, 59, 1, 0, 94, 95, 1, 0, 96, 98, 2, 0, 72, 72, 85, 85, 2, 0, 87, 87, 89, 93, 2, 0, 30, 30, 32, 33, 3, 0, 59, 59, 102, 102, 108, 109, 8, 0, 59, 59, 64, 64, 66, 67, 69, 69, 102, 102, 108, 109, 114, 114, 156, 158, 2, 0, 108, 108, 114, 114, 3, 0, 59, 59, 108, 108, 114, 114, 1223, 0, 233, 1, 0, 0, 0, 2, 239, 1, 0, 0, 0, 4, 242, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 8, 294, 1, 0, 0, 0, 10, 296, 1, 0, 0, 0, 12, 299, 1, 0, 0, 0, 14, 301, 1, 0, 0, 0, 16, 304, 1, 0, 0, 0, 18, 315, 1, 0, 0, 0, 20, 319, 1, 0, 0, 0, 22, 322, 1, 0, 0, 0, 24, 325, 1, 0, 0, 0, 26, 329, 1, 0, 0, 0, 28, 342, 1, 0, 0, 0, 30, 344, 1, 0, 0, 0, 32, 366, 1, 0, 0, 0, 34, 368, 1, 0, 0, 0, 36, 370, 1, 0, 0, 0, 38, 372, 1, 0, 0, 0, 40, 374, 1, 0, 0, 0, 42, 376, 1, 0, 0, 0, 44, 385, 1, 0, 0, 0, 46, 388, 1, 0, 0, 0, 48, 396, 1, 0, 0, 0, 50, 404, 1, 0, 0, 0, 52, 421, 1, 0, 0, 0, 54, 423, 1, 0, 0, 0, 56, 443, 1, 0, 0, 0, 58, 445, 1, 0, 0, 0, 60, 453, 1, 0, 0, 0, 62, 461, 1, 0, 0, 0, 64, 466, 1, 0, 0, 0, 66, 470, 1, 0, 0, 0, 68, 474, 1, 0, 0, 0, 70, 479, 1, 0, 0, 0, 72, 483, 1, 0, 0, 0, 74, 485, 1, 0, 0, 0, 76, 490, 1, 0, 0, 0, 78, 500, 1, 0, 0, 0, 80, 509, 1, 0, 0, 0, 82, 517, 1, 0, 0, 0, 84, 520, 1, 0, 0, 0, 86, 523, 1, 0, 0, 0, 88, 540, 1, 0, 0, 0, 90, 542, 1, 0, 0, 0, 92, 548, 1, 0, 0, 0, 94, 556, 1, 0, 0, 0, 96, 562, 1, 0, 0, 0, 98, 564, 1, 0, 0, 0, 100, 574, 1, 0, 0, 0, 102, 577, 1, 0, 0, 0, 104, 580, 1, 0, 0, 0, 106, 584, 1, 0, 0, 0, 108, 587, 1, 0, 0, 0, 110, 604, 1, 0, 0, 0, 112, 609, 1, 0, 0, 0, 114, 613, 1, 0, 0, 0, 116, 616, 1, 0, 0, 0, 118, 631, 1, 0, 0, 0, 120, 633, 1, 0, 0, 0, 122, 637, 1, 0, 0, 0, 124, 641, 1, 0, 0, 0, 126, 645, 1, 0, 0, 0, 128, 656, 1, 0, 0, 0, 130, 658, 1, 0, 0, 0, 132, 669, 1, 0, 0, 0, 134, 691, 1, 0, 0, 0, 136, 693, 1, 0, 0, 0, 138, 714, 1, 0, 0, 0, 140, 716, 1, 0, 0, 0, 142, 724, 1, 0, 0, 0, 144, 726, 1, 0, 0, 0, 146, 728, 1, 0, 0, 0, 148, 733, 1, 0, 0, 0, 150, 736, 1, 0, 0, 0, 152, 741, 1, 0, 0, 0, 154, 746, 1, 0, 0, 0, 156, 752, 1, 0, 0, 0, 158, 756, 1, 0, 0, 0, 160, 762, 1, 0, 0, 0, 162, 774, 1, 0, 0, 0, 164, 805, 1, 0, 0, 0, 166, 864, 1, 0, 0, 0, 168, 866, 1, 0, 0, 0, 170, 879, 1, 0, 0, 0, 172, 885, 1, 0, 0, 0, 174, 906, 1, 0, 0, 0, 176, 916, 1, 0, 0, 0, 178, 938, 1, 0, 0, 0, 180, 940, 1, 0, 0, 0, 182, 953, 1, 0, 0, 0, 184, 959, 1, 0, 0, 0, 186, 1003, 1, 0, 0, 0, 188, 1005, 1, 0, 0, 0, 190, 1009, 1, 0, 0, 0, 192, 1012, 1, 0, 0, 0, 194, 1017, 1, 0, 0, 0, 196, 1021, 1, 0, 0, 0, 198, 1023, 1, 0, 0, 0, 200, 1025, 1, 0, 0, 0, 202, 1038, 1, 0, 0, 0, 204, 1040, 1, 0, 0, 0, 206, 1109, 1, 0, 0, 0, 208, 1111, 1, 0, 0, 0, 210, 1113, 1, 0, 0, 0, 212, 1117, 1, 0, 0, 0, 214, 1129, 1, 0, 0, 0, 216, 1131, 1, 0, 0, 0, 218, 1146, 1, 0, 0, 0, 220, 1157, 1, 0, 0, 0, 222, 1159, 1, 0, 0, 0, 224, 1161, 1, 0, 0, 0, 226, 1163, 1, 0, 0, 0, 228, 1165, 1, 0, 0, 0, 230, 232, 3, 156, 78, 0, 231, 230, 1, 0, 0, 0, 232, 235, 1, 0, 0, 0, 233, 231, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 236, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 236, 237, 3, 2, 1, 0, 237, 238, 5, 0, 0, 1, 238, 1, 1, 0, 0, 0, 239, 240, 3, 4, 2, 0, 240, 241, 5, 0, 0, 1, 241, 3, 1, 0, 0, 0, 242, 243, 6, 2, -1, 0, 243, 244, 3, 6, 3, 0, 244, 250, 1, 0, 0, 0, 245, 246, 10, 1, 0, 0, 246, 247, 5, 58, 0, 0, 247, 249, 3, 8, 4, 0, 248, 245, 1, 0, 0, 0, 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 5, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 253, 263, 3, 20, 10, 0, 254, 263, 3, 14, 7, 0, 255, 263, 3, 106, 53, 0, 256, 263, 3, 22, 11, 0, 257, 263, 3, 206, 103, 0, 258, 259, 4, 3, 1, 0, 259, 263, 3, 102, 51, 0, 260, 261, 4, 3, 2, 0, 261, 263, 3, 24, 12, 0, 262, 253, 1, 0, 0, 0, 262, 254, 1, 0, 0, 0, 262, 255, 1, 0, 0, 0, 262, 256, 1, 0, 0, 0, 262, 257, 1, 0, 0, 0, 262, 258, 1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 263, 7, 1, 0, 0, 0, 264, 295, 3, 44, 22, 0, 265, 295, 3, 10, 5, 0, 266, 295, 3, 82, 41, 0, 267, 295, 3, 74, 37, 0, 268, 295, 3, 46, 23, 0, 269, 295, 3, 78, 39, 0, 270, 295, 3, 84, 42, 0, 271, 295, 3, 86, 43, 0, 272, 295, 3, 90, 45, 0, 273, 295, 3, 98, 49, 0, 274, 295, 3, 108, 54, 0, 275, 295, 3, 100, 50, 0, 276, 295, 3, 200, 100, 0, 277, 295, 3, 116, 58, 0, 278, 295, 3, 132, 66, 0, 279, 295, 3, 114, 57, 0, 280, 295, 3, 120, 60, 0, 281, 295, 3, 130, 65, 0, 282, 295, 3, 134, 67, 0, 283, 295, 3, 136, 68, 0, 284, 295, 3, 150, 75, 0, 285, 295, 3, 142, 71, 0, 286, 295, 3, 152, 76, 0, 287, 295, 3, 144, 72, 0, 288, 295, 3, 154, 77, 0, 289, 295, 3, 160, 80, 0, 290, 291, 4, 4, 3, 0, 291, 295, 3, 146, 73, 0, 292, 293, 4, 4, 4, 0, 293, 295, 3, 148, 74, 0, 294, 264, 1, 0, 0, 0, 294, 265, 1, 0, 0, 0, 294, 266, 1, 0, 0, 0, 294, 267, 1, 0, 0, 0, 294, 268, 1, 0, 0, 0, 294, 269, 1, 0, 0, 0, 294, 270, 1, 0, 0, 0, 294, 271, 1, 0, 0, 0, 294, 272, 1, 0, 0, 0, 294, 273, 1, 0, 0, 0, 294, 274, 1, 0, 0, 0, 294, 275, 1, 0, 0, 0, 294, 276, 1, 0, 0, 0, 294, 277, 1, 0, 0, 0, 294, 278, 1, 0, 0, 0, 294, 279, 1, 0, 0, 0, 294, 280, 1, 0, 0, 0, 294, 281, 1, 0, 0, 0, 294, 282, 1, 0, 0, 0, 294, 283, 1, 0, 0, 0, 294, 284, 1, 0, 0, 0, 294, 285, 1, 0, 0, 0, 294, 286, 1, 0, 0, 0, 294, 287, 1, 0, 0, 0, 294, 288, 1, 0, 0, 0, 294, 289, 1, 0, 0, 0, 294, 290, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 295, 9, 1, 0, 0, 0, 296, 297, 5, 17, 0, 0, 297, 298, 3, 164, 82, 0, 298, 11, 1, 0, 0, 0, 299, 300, 3, 62, 31, 0, 300, 13, 1, 0, 0, 0, 301, 302, 5, 13, 0, 0, 302, 303, 3, 16, 8, 0, 303, 15, 1, 0, 0, 0, 304, 309, 3, 18, 9, 0, 305, 306, 5, 69, 0, 0, 306, 308, 3, 18, 9, 0, 307, 305, 1, 0, 0, 0, 308, 311, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 17, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 312, 313, 3, 52, 26, 0, 313, 314, 5, 64, 0, 0, 314, 316, 1, 0, 0, 0, 315, 312, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 318, 3, 164, 82, 0, 318, 19, 1, 0, 0, 0, 319, 320, 5, 23, 0, 0, 320, 321, 3, 26, 13, 0, 321, 21, 1, 0, 0, 0, 322, 323, 5, 24, 0, 0, 323, 324, 3, 26, 13, 0, 324, 23, 1, 0, 0, 0, 325, 326, 5, 25, 0, 0, 326, 327, 3, 72, 36, 0, 327, 328, 3, 96, 48, 0, 328, 25, 1, 0, 0, 0, 329, 334, 3, 28, 14, 0, 330, 331, 5, 69, 0, 0, 331, 333, 3, 28, 14, 0, 332, 330, 1, 0, 0, 0, 333, 336, 1, 0, 0, 0, 334, 332, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 339, 3, 42, 21, 0, 338, 337, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 27, 1, 0, 0, 0, 340, 343, 3, 32, 16, 0, 341, 343, 3, 30, 15, 0, 342, 340, 1, 0, 0, 0, 342, 341, 1, 0, 0, 0, 343, 29, 1, 0, 0, 0, 344, 345, 5, 106, 0, 0, 345, 350, 3, 20, 10, 0, 346, 347, 5, 58, 0, 0, 347, 349, 3, 8, 4, 0, 348, 346, 1, 0, 0, 0, 349, 352, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 353, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 353, 354, 5, 107, 0, 0, 354, 31, 1, 0, 0, 0, 355, 356, 3, 34, 17, 0, 356, 357, 5, 67, 0, 0, 357, 359, 1, 0, 0, 0, 358, 355, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 363, 3, 38, 19, 0, 361, 362, 5, 66, 0, 0, 362, 364, 3, 36, 18, 0, 363, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 367, 1, 0, 0, 0, 365, 367, 3, 40, 20, 0, 366, 358, 1, 0, 0, 0, 366, 365, 1, 0, 0, 0, 367, 33, 1, 0, 0, 0, 368, 369, 5, 114, 0, 0, 369, 35, 1, 0, 0, 0, 370, 371, 5, 114, 0, 0, 371, 37, 1, 0, 0, 0, 372, 373, 5, 114, 0, 0, 373, 39, 1, 0, 0, 0, 374, 375, 7, 0, 0, 0, 375, 41, 1, 0, 0, 0, 376, 377, 5, 113, 0, 0, 377, 382, 5, 114, 0, 0, 378, 379, 5, 69, 0, 0, 379, 381, 5, 114, 0, 0, 380, 378, 1, 0, 0, 0, 381, 384, 1, 0, 0, 0, 382, 380, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 43, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 385, 386, 5, 9, 0, 0, 386, 387, 3, 16, 8, 0, 387, 45, 1, 0, 0, 0, 388, 390, 5, 16, 0, 0, 389, 391, 3, 48, 24, 0, 390, 389, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 394, 1, 0, 0, 0, 392, 393, 5, 65, 0, 0, 393, 395, 3, 16, 8, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 47, 1, 0, 0, 0, 396, 401, 3, 50, 25, 0, 397, 398, 5, 69, 0, 0, 398, 400, 3, 50, 25, 0, 399, 397, 1, 0, 0, 0, 400, 403, 1, 0, 0, 0, 401, 399, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 49, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 404, 407, 3, 18, 9, 0, 405, 406, 5, 17, 0, 0, 406, 408, 3, 164, 82, 0, 407, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 51, 1, 0, 0, 0, 409, 410, 4, 26, 5, 0, 410, 412, 5, 104, 0, 0, 411, 413, 5, 108, 0, 0, 412, 411, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 71, 0, 0, 416, 417, 5, 104, 0, 0, 417, 418, 3, 54, 27, 0, 418, 419, 5, 105, 0, 0, 419, 422, 1, 0, 0, 0, 420, 422, 3, 54, 27, 0, 421, 409, 1, 0, 0, 0, 421, 420, 1, 0, 0, 0, 422, 53, 1, 0, 0, 0, 423, 428, 3, 70, 35, 0, 424, 425, 5, 71, 0, 0, 425, 427, 3, 70, 35, 0, 426, 424, 1, 0, 0, 0, 427, 430, 1, 0, 0, 0, 428, 426, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 55, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 431, 432, 4, 28, 6, 0, 432, 434, 5, 104, 0, 0, 433, 435, 5, 149, 0, 0, 434, 433, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 5, 105, 0, 0, 437, 438, 5, 71, 0, 0, 438, 439, 5, 104, 0, 0, 439, 440, 3, 58, 29, 0, 440, 441, 5, 105, 0, 0, 441, 444, 1, 0, 0, 0, 442, 444, 3, 58, 29, 0, 443, 431, 1, 0, 0, 0, 443, 442, 1, 0, 0, 0, 444, 57, 1, 0, 0, 0, 445, 450, 3, 64, 32, 0, 446, 447, 5, 71, 0, 0, 447, 449, 3, 64, 32, 0, 448, 446, 1, 0, 0, 0, 449, 452, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 59, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 453, 458, 3, 56, 28, 0, 454, 455, 5, 69, 0, 0, 455, 457, 3, 56, 28, 0, 456, 454, 1, 0, 0, 0, 457, 460, 1, 0, 0, 0, 458, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 61, 1, 0, 0, 0, 460, 458, 1, 0, 0, 0, 461, 462, 7, 1, 0, 0, 462, 63, 1, 0, 0, 0, 463, 467, 5, 149, 0, 0, 464, 467, 3, 66, 33, 0, 465, 467, 3, 68, 34, 0, 466, 463, 1, 0, 0, 0, 466, 464, 1, 0, 0, 0, 466, 465, 1, 0, 0, 0, 467, 65, 1, 0, 0, 0, 468, 471, 5, 83, 0, 0, 469, 471, 5, 102, 0, 0, 470, 468, 1, 0, 0, 0, 470, 469, 1, 0, 0, 0, 471, 67, 1, 0, 0, 0, 472, 475, 5, 101, 0, 0, 473, 475, 5, 103, 0, 0, 474, 472, 1, 0, 0, 0, 474, 473, 1, 0, 0, 0, 475, 69, 1, 0, 0, 0, 476, 480, 3, 62, 31, 0, 477, 480, 3, 66, 33, 0, 478, 480, 3, 68, 34, 0, 479, 476, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 479, 478, 1, 0, 0, 0, 480, 71, 1, 0, 0, 0, 481, 484, 3, 196, 98, 0, 482, 484, 3, 66, 33, 0, 483, 481, 1, 0, 0, 0, 483, 482, 1, 0, 0, 0, 484, 73, 1, 0, 0, 0, 485, 486, 5, 11, 0, 0, 486, 488, 3, 186, 93, 0, 487, 489, 3, 76, 38, 0, 488, 487, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 75, 1, 0, 0, 0, 490, 491, 4, 38, 7, 0, 491, 492, 5, 65, 0, 0, 492, 497, 3, 164, 82, 0, 493, 494, 5, 69, 0, 0, 494, 496, 3, 164, 82, 0, 495, 493, 1, 0, 0, 0, 496, 499, 1, 0, 0, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 77, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 501, 5, 15, 0, 0, 501, 506, 3, 80, 40, 0, 502, 503, 5, 69, 0, 0, 503, 505, 3, 80, 40, 0, 504, 502, 1, 0, 0, 0, 505, 508, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 79, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 509, 511, 3, 164, 82, 0, 510, 512, 7, 2, 0, 0, 511, 510, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 514, 5, 80, 0, 0, 514, 516, 7, 3, 0, 0, 515, 513, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 81, 1, 0, 0, 0, 517, 518, 5, 38, 0, 0, 518, 519, 3, 60, 30, 0, 519, 83, 1, 0, 0, 0, 520, 521, 5, 37, 0, 0, 521, 522, 3, 60, 30, 0, 522, 85, 1, 0, 0, 0, 523, 524, 5, 41, 0, 0, 524, 529, 3, 88, 44, 0, 525, 526, 5, 69, 0, 0, 526, 528, 3, 88, 44, 0, 527, 525, 1, 0, 0, 0, 528, 531, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 87, 1, 0, 0, 0, 531, 529, 1, 0, 0, 0, 532, 533, 3, 56, 28, 0, 533, 534, 5, 159, 0, 0, 534, 535, 3, 56, 28, 0, 535, 541, 1, 0, 0, 0, 536, 537, 3, 56, 28, 0, 537, 538, 5, 64, 0, 0, 538, 539, 3, 56, 28, 0, 539, 541, 1, 0, 0, 0, 540, 532, 1, 0, 0, 0, 540, 536, 1, 0, 0, 0, 541, 89, 1, 0, 0, 0, 542, 543, 5, 8, 0, 0, 543, 544, 3, 174, 87, 0, 544, 546, 3, 196, 98, 0, 545, 547, 3, 92, 46, 0, 546, 545, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 91, 1, 0, 0, 0, 548, 553, 3, 94, 47, 0, 549, 550, 5, 69, 0, 0, 550, 552, 3, 94, 47, 0, 551, 549, 1, 0, 0, 0, 552, 555, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 93, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 556, 557, 3, 62, 31, 0, 557, 558, 5, 64, 0, 0, 558, 559, 3, 186, 93, 0, 559, 95, 1, 0, 0, 0, 560, 561, 5, 86, 0, 0, 561, 563, 3, 180, 90, 0, 562, 560, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 97, 1, 0, 0, 0, 564, 565, 5, 10, 0, 0, 565, 566, 3, 174, 87, 0, 566, 571, 3, 196, 98, 0, 567, 568, 5, 69, 0, 0, 568, 570, 3, 196, 98, 0, 569, 567, 1, 0, 0, 0, 570, 573, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 99, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 574, 575, 5, 36, 0, 0, 575, 576, 3, 52, 26, 0, 576, 101, 1, 0, 0, 0, 577, 578, 5, 6, 0, 0, 578, 579, 3, 104, 52, 0, 579, 103, 1, 0, 0, 0, 580, 581, 5, 106, 0, 0, 581, 582, 3, 4, 2, 0, 582, 583, 5, 107, 0, 0, 583, 105, 1, 0, 0, 0, 584, 585, 5, 43, 0, 0, 585, 586, 5, 166, 0, 0, 586, 107, 1, 0, 0, 0, 587, 588, 5, 5, 0, 0, 588, 591, 3, 110, 55, 0, 589, 590, 5, 81, 0, 0, 590, 592, 3, 56, 28, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 602, 1, 0, 0, 0, 593, 594, 5, 86, 0, 0, 594, 599, 3, 112, 56, 0, 595, 596, 5, 69, 0, 0, 596, 598, 3, 112, 56, 0, 597, 595, 1, 0, 0, 0, 598, 601, 1, 0, 0, 0, 599, 597, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 603, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0, 602, 593, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 109, 1, 0, 0, 0, 604, 605, 7, 4, 0, 0, 605, 111, 1, 0, 0, 0, 606, 607, 3, 56, 28, 0, 607, 608, 5, 64, 0, 0, 608, 610, 1, 0, 0, 0, 609, 606, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 612, 3, 56, 28, 0, 612, 113, 1, 0, 0, 0, 613, 614, 5, 14, 0, 0, 614, 615, 3, 186, 93, 0, 615, 115, 1, 0, 0, 0, 616, 617, 5, 4, 0, 0, 617, 621, 3, 52, 26, 0, 618, 620, 3, 118, 59, 0, 619, 618, 1, 0, 0, 0, 620, 623, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 117, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 624, 625, 5, 81, 0, 0, 625, 632, 3, 52, 26, 0, 626, 627, 5, 159, 0, 0, 627, 628, 3, 52, 26, 0, 628, 629, 5, 69, 0, 0, 629, 630, 3, 52, 26, 0, 630, 632, 1, 0, 0, 0, 631, 624, 1, 0, 0, 0, 631, 626, 1, 0, 0, 0, 632, 119, 1, 0, 0, 0, 633, 634, 5, 26, 0, 0, 634, 635, 3, 122, 61, 0, 635, 121, 1, 0, 0, 0, 636, 638, 3, 124, 62, 0, 637, 636, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 637, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 123, 1, 0, 0, 0, 641, 642, 5, 106, 0, 0, 642, 643, 3, 126, 63, 0, 643, 644, 5, 107, 0, 0, 644, 125, 1, 0, 0, 0, 645, 646, 6, 63, -1, 0, 646, 647, 3, 128, 64, 0, 647, 653, 1, 0, 0, 0, 648, 649, 10, 1, 0, 0, 649, 650, 5, 58, 0, 0, 650, 652, 3, 128, 64, 0, 651, 648, 1, 0, 0, 0, 652, 655, 1, 0, 0, 0, 653, 651, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 127, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 656, 657, 3, 8, 4, 0, 657, 129, 1, 0, 0, 0, 658, 662, 5, 12, 0, 0, 659, 660, 3, 52, 26, 0, 660, 661, 5, 64, 0, 0, 661, 663, 1, 0, 0, 0, 662, 659, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 665, 3, 186, 93, 0, 665, 666, 5, 81, 0, 0, 666, 667, 3, 16, 8, 0, 667, 668, 3, 96, 48, 0, 668, 131, 1, 0, 0, 0, 669, 673, 5, 7, 0, 0, 670, 671, 3, 52, 26, 0, 671, 672, 5, 64, 0, 0, 672, 674, 1, 0, 0, 0, 673, 670, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 676, 3, 174, 87, 0, 676, 677, 3, 96, 48, 0, 677, 133, 1, 0, 0, 0, 678, 679, 5, 28, 0, 0, 679, 680, 5, 127, 0, 0, 680, 683, 3, 48, 24, 0, 681, 682, 5, 65, 0, 0, 682, 684, 3, 16, 8, 0, 683, 681, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 692, 1, 0, 0, 0, 685, 686, 5, 29, 0, 0, 686, 689, 3, 48, 24, 0, 687, 688, 5, 65, 0, 0, 688, 690, 3, 16, 8, 0, 689, 687, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 692, 1, 0, 0, 0, 691, 678, 1, 0, 0, 0, 691, 685, 1, 0, 0, 0, 692, 135, 1, 0, 0, 0, 693, 695, 5, 27, 0, 0, 694, 696, 3, 62, 31, 0, 695, 694, 1, 0, 0, 0, 695, 696, 1, 0, 0, 0, 696, 700, 1, 0, 0, 0, 697, 699, 3, 138, 69, 0, 698, 697, 1, 0, 0, 0, 699, 702, 1, 0, 0, 0, 700, 698, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 137, 1, 0, 0, 0, 702, 700, 1, 0, 0, 0, 703, 704, 5, 122, 0, 0, 704, 705, 5, 65, 0, 0, 705, 715, 3, 52, 26, 0, 706, 707, 5, 123, 0, 0, 707, 708, 5, 65, 0, 0, 708, 715, 3, 140, 70, 0, 709, 710, 5, 121, 0, 0, 710, 711, 5, 65, 0, 0, 711, 715, 3, 52, 26, 0, 712, 713, 5, 86, 0, 0, 713, 715, 3, 180, 90, 0, 714, 703, 1, 0, 0, 0, 714, 706, 1, 0, 0, 0, 714, 709, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 715, 139, 1, 0, 0, 0, 716, 721, 3, 52, 26, 0, 717, 718, 5, 69, 0, 0, 718, 720, 3, 52, 26, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 141, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 725, 5, 19, 0, 0, 725, 143, 1, 0, 0, 0, 726, 727, 5, 21, 0, 0, 727, 145, 1, 0, 0, 0, 728, 729, 5, 34, 0, 0, 729, 730, 3, 32, 16, 0, 730, 731, 5, 81, 0, 0, 731, 732, 3, 60, 30, 0, 732, 147, 1, 0, 0, 0, 733, 734, 5, 39, 0, 0, 734, 735, 3, 60, 30, 0, 735, 149, 1, 0, 0, 0, 736, 737, 5, 18, 0, 0, 737, 738, 3, 52, 26, 0, 738, 739, 5, 64, 0, 0, 739, 740, 3, 174, 87, 0, 740, 151, 1, 0, 0, 0, 741, 742, 5, 20, 0, 0, 742, 743, 3, 52, 26, 0, 743, 744, 5, 64, 0, 0, 744, 745, 3, 174, 87, 0, 745, 153, 1, 0, 0, 0, 746, 747, 5, 22, 0, 0, 747, 748, 3, 52, 26, 0, 748, 749, 5, 64, 0, 0, 749, 750, 3, 174, 87, 0, 750, 751, 3, 96, 48, 0, 751, 155, 1, 0, 0, 0, 752, 753, 5, 42, 0, 0, 753, 754, 3, 158, 79, 0, 754, 755, 5, 68, 0, 0, 755, 157, 1, 0, 0, 0, 756, 757, 3, 62, 31, 0, 757, 760, 5, 64, 0, 0, 758, 761, 3, 186, 93, 0, 759, 761, 3, 180, 90, 0, 760, 758, 1, 0, 0, 0, 760, 759, 1, 0, 0, 0, 761, 159, 1, 0, 0, 0, 762, 764, 5, 35, 0, 0, 763, 765, 3, 162, 81, 0, 764, 763, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 1, 0, 0, 0, 766, 767, 5, 81, 0, 0, 767, 768, 3, 52, 26, 0, 768, 769, 5, 142, 0, 0, 769, 770, 3, 194, 97, 0, 770, 771, 3, 96, 48, 0, 771, 161, 1, 0, 0, 0, 772, 775, 3, 66, 33, 0, 773, 775, 3, 174, 87, 0, 774, 772, 1, 0, 0, 0, 774, 773, 1, 0, 0, 0, 775, 163, 1, 0, 0, 0, 776, 777, 6, 82, -1, 0, 777, 778, 5, 78, 0, 0, 778, 806, 3, 164, 82, 8, 779, 806, 3, 170, 85, 0, 780, 806, 3, 166, 83, 0, 781, 783, 3, 170, 85, 0, 782, 784, 5, 78, 0, 0, 783, 782, 1, 0, 0, 0, 783, 784, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 786, 5, 74, 0, 0, 786, 787, 5, 106, 0, 0, 787, 792, 3, 170, 85, 0, 788, 789, 5, 69, 0, 0, 789, 791, 3, 170, 85, 0, 790, 788, 1, 0, 0, 0, 791, 794, 1, 0, 0, 0, 792, 790, 1, 0, 0, 0, 792, 793, 1, 0, 0, 0, 793, 795, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 795, 796, 5, 107, 0, 0, 796, 806, 1, 0, 0, 0, 797, 798, 3, 170, 85, 0, 798, 800, 5, 75, 0, 0, 799, 801, 5, 78, 0, 0, 800, 799, 1, 0, 0, 0, 800, 801, 1, 0, 0, 0, 801, 802, 1, 0, 0, 0, 802, 803, 5, 79, 0, 0, 803, 806, 1, 0, 0, 0, 804, 806, 3, 168, 84, 0, 805, 776, 1, 0, 0, 0, 805, 779, 1, 0, 0, 0, 805, 780, 1, 0, 0, 0, 805, 781, 1, 0, 0, 0, 805, 797, 1, 0, 0, 0, 805, 804, 1, 0, 0, 0, 806, 815, 1, 0, 0, 0, 807, 808, 10, 5, 0, 0, 808, 809, 5, 62, 0, 0, 809, 814, 3, 164, 82, 6, 810, 811, 10, 4, 0, 0, 811, 812, 5, 82, 0, 0, 812, 814, 3, 164, 82, 5, 813, 807, 1, 0, 0, 0, 813, 810, 1, 0, 0, 0, 814, 817, 1, 0, 0, 0, 815, 813, 1, 0, 0, 0, 815, 816, 1, 0, 0, 0, 816, 165, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 818, 820, 3, 170, 85, 0, 819, 821, 5, 78, 0, 0, 820, 819, 1, 0, 0, 0, 820, 821, 1, 0, 0, 0, 821, 822, 1, 0, 0, 0, 822, 823, 5, 77, 0, 0, 823, 824, 3, 72, 36, 0, 824, 865, 1, 0, 0, 0, 825, 827, 3, 170, 85, 0, 826, 828, 5, 78, 0, 0, 827, 826, 1, 0, 0, 0, 827, 828, 1, 0, 0, 0, 828, 829, 1, 0, 0, 0, 829, 830, 5, 84, 0, 0, 830, 831, 3, 72, 36, 0, 831, 865, 1, 0, 0, 0, 832, 834, 3, 170, 85, 0, 833, 835, 5, 78, 0, 0, 834, 833, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 837, 5, 77, 0, 0, 837, 838, 5, 106, 0, 0, 838, 843, 3, 72, 36, 0, 839, 840, 5, 69, 0, 0, 840, 842, 3, 72, 36, 0, 841, 839, 1, 0, 0, 0, 842, 845, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 846, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 846, 847, 5, 107, 0, 0, 847, 865, 1, 0, 0, 0, 848, 850, 3, 170, 85, 0, 849, 851, 5, 78, 0, 0, 850, 849, 1, 0, 0, 0, 850, 851, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 5, 84, 0, 0, 853, 854, 5, 106, 0, 0, 854, 859, 3, 72, 36, 0, 855, 856, 5, 69, 0, 0, 856, 858, 3, 72, 36, 0, 857, 855, 1, 0, 0, 0, 858, 861, 1, 0, 0, 0, 859, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 862, 1, 0, 0, 0, 861, 859, 1, 0, 0, 0, 862, 863, 5, 107, 0, 0, 863, 865, 1, 0, 0, 0, 864, 818, 1, 0, 0, 0, 864, 825, 1, 0, 0, 0, 864, 832, 1, 0, 0, 0, 864, 848, 1, 0, 0, 0, 865, 167, 1, 0, 0, 0, 866, 869, 3, 52, 26, 0, 867, 868, 5, 66, 0, 0, 868, 870, 3, 12, 6, 0, 869, 867, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 5, 67, 0, 0, 872, 873, 3, 186, 93, 0, 873, 169, 1, 0, 0, 0, 874, 880, 3, 172, 86, 0, 875, 876, 3, 172, 86, 0, 876, 877, 3, 198, 99, 0, 877, 878, 3, 172, 86, 0, 878, 880, 1, 0, 0, 0, 879, 874, 1, 0, 0, 0, 879, 875, 1, 0, 0, 0, 880, 171, 1, 0, 0, 0, 881, 882, 6, 86, -1, 0, 882, 886, 3, 174, 87, 0, 883, 884, 7, 5, 0, 0, 884, 886, 3, 172, 86, 3, 885, 881, 1, 0, 0, 0, 885, 883, 1, 0, 0, 0, 886, 895, 1, 0, 0, 0, 887, 888, 10, 2, 0, 0, 888, 889, 7, 6, 0, 0, 889, 894, 3, 172, 86, 3, 890, 891, 10, 1, 0, 0, 891, 892, 7, 5, 0, 0, 892, 894, 3, 172, 86, 2, 893, 887, 1, 0, 0, 0, 893, 890, 1, 0, 0, 0, 894, 897, 1, 0, 0, 0, 895, 893, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 173, 1, 0, 0, 0, 897, 895, 1, 0, 0, 0, 898, 899, 6, 87, -1, 0, 899, 907, 3, 186, 93, 0, 900, 907, 3, 52, 26, 0, 901, 907, 3, 176, 88, 0, 902, 903, 5, 106, 0, 0, 903, 904, 3, 164, 82, 0, 904, 905, 5, 107, 0, 0, 905, 907, 1, 0, 0, 0, 906, 898, 1, 0, 0, 0, 906, 900, 1, 0, 0, 0, 906, 901, 1, 0, 0, 0, 906, 902, 1, 0, 0, 0, 907, 913, 1, 0, 0, 0, 908, 909, 10, 1, 0, 0, 909, 910, 5, 66, 0, 0, 910, 912, 3, 12, 6, 0, 911, 908, 1, 0, 0, 0, 912, 915, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 175, 1, 0, 0, 0, 915, 913, 1, 0, 0, 0, 916, 917, 3, 178, 89, 0, 917, 931, 5, 106, 0, 0, 918, 932, 5, 96, 0, 0, 919, 924, 3, 164, 82, 0, 920, 921, 5, 69, 0, 0, 921, 923, 3, 164, 82, 0, 922, 920, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 929, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 69, 0, 0, 928, 930, 3, 180, 90, 0, 929, 927, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 932, 1, 0, 0, 0, 931, 918, 1, 0, 0, 0, 931, 919, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 933, 1, 0, 0, 0, 933, 934, 5, 107, 0, 0, 934, 177, 1, 0, 0, 0, 935, 939, 3, 70, 35, 0, 936, 939, 5, 73, 0, 0, 937, 939, 5, 76, 0, 0, 938, 935, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 179, 1, 0, 0, 0, 940, 949, 5, 99, 0, 0, 941, 946, 3, 182, 91, 0, 942, 943, 5, 69, 0, 0, 943, 945, 3, 182, 91, 0, 944, 942, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 950, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 941, 1, 0, 0, 0, 949, 950, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 952, 5, 100, 0, 0, 952, 181, 1, 0, 0, 0, 953, 954, 3, 196, 98, 0, 954, 955, 5, 67, 0, 0, 955, 956, 3, 184, 92, 0, 956, 183, 1, 0, 0, 0, 957, 960, 3, 186, 93, 0, 958, 960, 3, 180, 90, 0, 959, 957, 1, 0, 0, 0, 959, 958, 1, 0, 0, 0, 960, 185, 1, 0, 0, 0, 961, 1004, 5, 79, 0, 0, 962, 963, 3, 194, 97, 0, 963, 964, 5, 108, 0, 0, 964, 1004, 1, 0, 0, 0, 965, 1004, 3, 192, 96, 0, 966, 1004, 3, 194, 97, 0, 967, 1004, 3, 188, 94, 0, 968, 1004, 3, 66, 33, 0, 969, 1004, 3, 196, 98, 0, 970, 971, 5, 104, 0, 0, 971, 976, 3, 190, 95, 0, 972, 973, 5, 69, 0, 0, 973, 975, 3, 190, 95, 0, 974, 972, 1, 0, 0, 0, 975, 978, 1, 0, 0, 0, 976, 974, 1, 0, 0, 0, 976, 977, 1, 0, 0, 0, 977, 979, 1, 0, 0, 0, 978, 976, 1, 0, 0, 0, 979, 980, 5, 105, 0, 0, 980, 1004, 1, 0, 0, 0, 981, 982, 5, 104, 0, 0, 982, 987, 3, 188, 94, 0, 983, 984, 5, 69, 0, 0, 984, 986, 3, 188, 94, 0, 985, 983, 1, 0, 0, 0, 986, 989, 1, 0, 0, 0, 987, 985, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 990, 1, 0, 0, 0, 989, 987, 1, 0, 0, 0, 990, 991, 5, 105, 0, 0, 991, 1004, 1, 0, 0, 0, 992, 993, 5, 104, 0, 0, 993, 998, 3, 196, 98, 0, 994, 995, 5, 69, 0, 0, 995, 997, 3, 196, 98, 0, 996, 994, 1, 0, 0, 0, 997, 1000, 1, 0, 0, 0, 998, 996, 1, 0, 0, 0, 998, 999, 1, 0, 0, 0, 999, 1001, 1, 0, 0, 0, 1000, 998, 1, 0, 0, 0, 1001, 1002, 5, 105, 0, 0, 1002, 1004, 1, 0, 0, 0, 1003, 961, 1, 0, 0, 0, 1003, 962, 1, 0, 0, 0, 1003, 965, 1, 0, 0, 0, 1003, 966, 1, 0, 0, 0, 1003, 967, 1, 0, 0, 0, 1003, 968, 1, 0, 0, 0, 1003, 969, 1, 0, 0, 0, 1003, 970, 1, 0, 0, 0, 1003, 981, 1, 0, 0, 0, 1003, 992, 1, 0, 0, 0, 1004, 187, 1, 0, 0, 0, 1005, 1006, 7, 7, 0, 0, 1006, 189, 1, 0, 0, 0, 1007, 1010, 3, 192, 96, 0, 1008, 1010, 3, 194, 97, 0, 1009, 1007, 1, 0, 0, 0, 1009, 1008, 1, 0, 0, 0, 1010, 191, 1, 0, 0, 0, 1011, 1013, 7, 5, 0, 0, 1012, 1011, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 5, 61, 0, 0, 1015, 193, 1, 0, 0, 0, 1016, 1018, 7, 5, 0, 0, 1017, 1016, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 5, 60, 0, 0, 1020, 195, 1, 0, 0, 0, 1021, 1022, 5, 59, 0, 0, 1022, 197, 1, 0, 0, 0, 1023, 1024, 7, 8, 0, 0, 1024, 199, 1, 0, 0, 0, 1025, 1026, 7, 9, 0, 0, 1026, 1027, 5, 131, 0, 0, 1027, 1028, 3, 202, 101, 0, 1028, 1029, 3, 204, 102, 0, 1029, 201, 1, 0, 0, 0, 1030, 1031, 4, 101, 14, 0, 1031, 1033, 3, 32, 16, 0, 1032, 1034, 5, 159, 0, 0, 1033, 1032, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1035, 1, 0, 0, 0, 1035, 1036, 5, 114, 0, 0, 1036, 1039, 1, 0, 0, 0, 1037, 1039, 3, 32, 16, 0, 1038, 1030, 1, 0, 0, 0, 1038, 1037, 1, 0, 0, 0, 1039, 203, 1, 0, 0, 0, 1040, 1041, 5, 81, 0, 0, 1041, 1046, 3, 164, 82, 0, 1042, 1043, 5, 69, 0, 0, 1043, 1045, 3, 164, 82, 0, 1044, 1042, 1, 0, 0, 0, 1045, 1048, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 205, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1053, 5, 40, 0, 0, 1050, 1052, 3, 210, 105, 0, 1051, 1050, 1, 0, 0, 0, 1052, 1055, 1, 0, 0, 0, 1053, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1059, 1, 0, 0, 0, 1055, 1053, 1, 0, 0, 0, 1056, 1057, 3, 208, 104, 0, 1057, 1058, 5, 64, 0, 0, 1058, 1060, 1, 0, 0, 0, 1059, 1056, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1062, 5, 106, 0, 0, 1062, 1063, 5, 102, 0, 0, 1063, 1110, 5, 107, 0, 0, 1064, 1068, 5, 40, 0, 0, 1065, 1067, 3, 210, 105, 0, 1066, 1065, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1074, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1071, 1072, 3, 208, 104, 0, 1072, 1073, 5, 64, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1071, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1110, 5, 102, 0, 0, 1077, 1081, 5, 40, 0, 0, 1078, 1080, 3, 210, 105, 0, 1079, 1078, 1, 0, 0, 0, 1080, 1083, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1087, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1084, 1085, 3, 208, 104, 0, 1085, 1086, 5, 64, 0, 0, 1086, 1088, 1, 0, 0, 0, 1087, 1084, 1, 0, 0, 0, 1087, 1088, 1, 0, 0, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1091, 5, 106, 0, 0, 1090, 1092, 3, 218, 109, 0, 1091, 1090, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1091, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 5, 107, 0, 0, 1096, 1110, 1, 0, 0, 0, 1097, 1101, 5, 40, 0, 0, 1098, 1100, 3, 210, 105, 0, 1099, 1098, 1, 0, 0, 0, 1100, 1103, 1, 0, 0, 0, 1101, 1099, 1, 0, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1105, 1, 0, 0, 0, 1103, 1101, 1, 0, 0, 0, 1104, 1106, 3, 218, 109, 0, 1105, 1104, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1110, 1, 0, 0, 0, 1109, 1049, 1, 0, 0, 0, 1109, 1064, 1, 0, 0, 0, 1109, 1077, 1, 0, 0, 0, 1109, 1097, 1, 0, 0, 0, 1110, 207, 1, 0, 0, 0, 1111, 1112, 7, 1, 0, 0, 1112, 209, 1, 0, 0, 0, 1113, 1114, 3, 212, 106, 0, 1114, 1115, 5, 64, 0, 0, 1115, 1116, 3, 214, 107, 0, 1116, 211, 1, 0, 0, 0, 1117, 1118, 7, 10, 0, 0, 1118, 213, 1, 0, 0, 0, 1119, 1124, 3, 220, 110, 0, 1120, 1121, 5, 69, 0, 0, 1121, 1123, 3, 220, 110, 0, 1122, 1120, 1, 0, 0, 0, 1123, 1126, 1, 0, 0, 0, 1124, 1122, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1130, 1, 0, 0, 0, 1126, 1124, 1, 0, 0, 0, 1127, 1130, 5, 109, 0, 0, 1128, 1130, 5, 102, 0, 0, 1129, 1119, 1, 0, 0, 0, 1129, 1127, 1, 0, 0, 0, 1129, 1128, 1, 0, 0, 0, 1130, 215, 1, 0, 0, 0, 1131, 1132, 7, 11, 0, 0, 1132, 217, 1, 0, 0, 0, 1133, 1135, 3, 216, 108, 0, 1134, 1133, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1134, 1, 0, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1147, 1, 0, 0, 0, 1138, 1142, 5, 106, 0, 0, 1139, 1141, 3, 218, 109, 0, 1140, 1139, 1, 0, 0, 0, 1141, 1144, 1, 0, 0, 0, 1142, 1140, 1, 0, 0, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1145, 1, 0, 0, 0, 1144, 1142, 1, 0, 0, 0, 1145, 1147, 5, 107, 0, 0, 1146, 1134, 1, 0, 0, 0, 1146, 1138, 1, 0, 0, 0, 1147, 219, 1, 0, 0, 0, 1148, 1149, 3, 222, 111, 0, 1149, 1150, 5, 67, 0, 0, 1150, 1151, 3, 226, 113, 0, 1151, 1158, 1, 0, 0, 0, 1152, 1153, 3, 226, 113, 0, 1153, 1154, 5, 66, 0, 0, 1154, 1155, 3, 224, 112, 0, 1155, 1158, 1, 0, 0, 0, 1156, 1158, 3, 228, 114, 0, 1157, 1148, 1, 0, 0, 0, 1157, 1152, 1, 0, 0, 0, 1157, 1156, 1, 0, 0, 0, 1158, 221, 1, 0, 0, 0, 1159, 1160, 7, 12, 0, 0, 1160, 223, 1, 0, 0, 0, 1161, 1162, 7, 12, 0, 0, 1162, 225, 1, 0, 0, 0, 1163, 1164, 7, 12, 0, 0, 1164, 227, 1, 0, 0, 0, 1165, 1166, 7, 13, 0, 0, 1166, 229, 1, 0, 0, 0, 114, 233, 250, 262, 294, 309, 315, 334, 338, 342, 350, 358, 363, 366, 382, 390, 394, 401, 407, 412, 421, 428, 434, 443, 450, 458, 466, 470, 474, 479, 483, 488, 497, 506, 511, 515, 529, 540, 546, 553, 562, 571, 591, 599, 602, 609, 621, 631, 639, 653, 662, 673, 683, 689, 691, 695, 700, 714, 721, 760, 764, 774, 783, 792, 800, 805, 813, 815, 820, 827, 834, 843, 850, 859, 864, 869, 879, 885, 893, 895, 906, 913, 924, 929, 931, 938, 946, 949, 959, 976, 987, 998, 1003, 1009, 1012, 1017, 1033, 1038, 1046, 1053, 1059, 1068, 1074, 1081, 1087, 1093, 1101, 1107, 1109, 1124, 1129, 1136, 1142, 1146, 1157] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java index 6c56ca4888df2..00cd303f285bf 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java @@ -28,38 +28,38 @@ public class EsqlBaseParser extends ParserConfig { LINE_COMMENT=1, MULTILINE_COMMENT=2, WS=3, CHANGE_POINT=4, ENRICH=5, DEV_EXPLAIN=6, COMPLETION=7, DISSECT=8, EVAL=9, GROK=10, LIMIT=11, RERANK=12, ROW=13, SAMPLE=14, SORT=15, STATS=16, WHERE=17, URI_PARTS=18, METRICS_INFO=19, - REGISTERED_DOMAIN=20, TS_INFO=21, FROM=22, TS=23, DEV_EXTERNAL=24, FORK=25, - FUSE=26, INLINE=27, INLINESTATS=28, JOIN_LOOKUP=29, DEV_JOIN_FULL=30, - DEV_JOIN_LEFT=31, DEV_JOIN_RIGHT=32, DEV_LOOKUP=33, MMR=34, MV_EXPAND=35, - DROP=36, KEEP=37, DEV_INSIST=38, PROMQL=39, RENAME=40, SET=41, SHOW=42, - UNKNOWN_CMD=43, CHANGE_POINT_LINE_COMMENT=44, CHANGE_POINT_MULTILINE_COMMENT=45, - CHANGE_POINT_WS=46, ENRICH_POLICY_NAME=47, ENRICH_LINE_COMMENT=48, ENRICH_MULTILINE_COMMENT=49, - ENRICH_WS=50, ENRICH_FIELD_LINE_COMMENT=51, ENRICH_FIELD_MULTILINE_COMMENT=52, - ENRICH_FIELD_WS=53, EXPLAIN_WS=54, EXPLAIN_LINE_COMMENT=55, EXPLAIN_MULTILINE_COMMENT=56, - PIPE=57, QUOTED_STRING=58, INTEGER_LITERAL=59, DECIMAL_LITERAL=60, AND=61, - ASC=62, ASSIGN=63, BY=64, CAST_OP=65, COLON=66, SEMICOLON=67, COMMA=68, - DESC=69, DOT=70, FALSE=71, FIRST=72, IN=73, IS=74, LAST=75, LIKE=76, NOT=77, - NULL=78, NULLS=79, ON=80, OR=81, PARAM=82, RLIKE=83, TRUE=84, WITH=85, - EQ=86, CIEQ=87, NEQ=88, LT=89, LTE=90, GT=91, GTE=92, PLUS=93, MINUS=94, - ASTERISK=95, SLASH=96, PERCENT=97, LEFT_BRACES=98, RIGHT_BRACES=99, DOUBLE_PARAMS=100, - NAMED_OR_POSITIONAL_PARAM=101, NAMED_OR_POSITIONAL_DOUBLE_PARAMS=102, - OPENING_BRACKET=103, CLOSING_BRACKET=104, LP=105, RP=106, UNQUOTED_IDENTIFIER=107, - QUOTED_IDENTIFIER=108, EXPR_LINE_COMMENT=109, EXPR_MULTILINE_COMMENT=110, - EXPR_WS=111, METADATA=112, UNQUOTED_SOURCE=113, FROM_LINE_COMMENT=114, - FROM_MULTILINE_COMMENT=115, FROM_WS=116, FORK_WS=117, FORK_LINE_COMMENT=118, - FORK_MULTILINE_COMMENT=119, GROUP=120, SCORE=121, KEY=122, FUSE_LINE_COMMENT=123, - FUSE_MULTILINE_COMMENT=124, FUSE_WS=125, INLINE_STATS=126, INLINE_LINE_COMMENT=127, - INLINE_MULTILINE_COMMENT=128, INLINE_WS=129, JOIN=130, USING=131, JOIN_LINE_COMMENT=132, - JOIN_MULTILINE_COMMENT=133, JOIN_WS=134, LOOKUP_LINE_COMMENT=135, LOOKUP_MULTILINE_COMMENT=136, - LOOKUP_WS=137, LOOKUP_FIELD_LINE_COMMENT=138, LOOKUP_FIELD_MULTILINE_COMMENT=139, - LOOKUP_FIELD_WS=140, MMR_LIMIT=141, MMR_LINE_COMMENT=142, MMR_MULTILINE_COMMENT=143, - MMR_WS=144, MVEXPAND_LINE_COMMENT=145, MVEXPAND_MULTILINE_COMMENT=146, - MVEXPAND_WS=147, ID_PATTERN=148, PROJECT_LINE_COMMENT=149, PROJECT_MULTILINE_COMMENT=150, - PROJECT_WS=151, PROMQL_PARAMS_LINE_COMMENT=152, PROMQL_PARAMS_MULTILINE_COMMENT=153, - PROMQL_PARAMS_WS=154, PROMQL_QUERY_COMMENT=155, PROMQL_SINGLE_QUOTED_STRING=156, - PROMQL_OTHER_QUERY_CONTENT=157, AS=158, RENAME_LINE_COMMENT=159, RENAME_MULTILINE_COMMENT=160, - RENAME_WS=161, SET_LINE_COMMENT=162, SET_MULTILINE_COMMENT=163, SET_WS=164, - INFO=165, SHOW_LINE_COMMENT=166, SHOW_MULTILINE_COMMENT=167, SHOW_WS=168; + REGISTERED_DOMAIN=20, TS_INFO=21, USER_AGENT=22, FROM=23, TS=24, DEV_EXTERNAL=25, + FORK=26, FUSE=27, INLINE=28, INLINESTATS=29, JOIN_LOOKUP=30, DEV_JOIN_FULL=31, + DEV_JOIN_LEFT=32, DEV_JOIN_RIGHT=33, DEV_LOOKUP=34, MMR=35, MV_EXPAND=36, + DROP=37, KEEP=38, DEV_INSIST=39, PROMQL=40, RENAME=41, SET=42, SHOW=43, + UNKNOWN_CMD=44, CHANGE_POINT_LINE_COMMENT=45, CHANGE_POINT_MULTILINE_COMMENT=46, + CHANGE_POINT_WS=47, ENRICH_POLICY_NAME=48, ENRICH_LINE_COMMENT=49, ENRICH_MULTILINE_COMMENT=50, + ENRICH_WS=51, ENRICH_FIELD_LINE_COMMENT=52, ENRICH_FIELD_MULTILINE_COMMENT=53, + ENRICH_FIELD_WS=54, EXPLAIN_WS=55, EXPLAIN_LINE_COMMENT=56, EXPLAIN_MULTILINE_COMMENT=57, + PIPE=58, QUOTED_STRING=59, INTEGER_LITERAL=60, DECIMAL_LITERAL=61, AND=62, + ASC=63, ASSIGN=64, BY=65, CAST_OP=66, COLON=67, SEMICOLON=68, COMMA=69, + DESC=70, DOT=71, FALSE=72, FIRST=73, IN=74, IS=75, LAST=76, LIKE=77, NOT=78, + NULL=79, NULLS=80, ON=81, OR=82, PARAM=83, RLIKE=84, TRUE=85, WITH=86, + EQ=87, CIEQ=88, NEQ=89, LT=90, LTE=91, GT=92, GTE=93, PLUS=94, MINUS=95, + ASTERISK=96, SLASH=97, PERCENT=98, LEFT_BRACES=99, RIGHT_BRACES=100, DOUBLE_PARAMS=101, + NAMED_OR_POSITIONAL_PARAM=102, NAMED_OR_POSITIONAL_DOUBLE_PARAMS=103, + OPENING_BRACKET=104, CLOSING_BRACKET=105, LP=106, RP=107, UNQUOTED_IDENTIFIER=108, + QUOTED_IDENTIFIER=109, EXPR_LINE_COMMENT=110, EXPR_MULTILINE_COMMENT=111, + EXPR_WS=112, METADATA=113, UNQUOTED_SOURCE=114, FROM_LINE_COMMENT=115, + FROM_MULTILINE_COMMENT=116, FROM_WS=117, FORK_WS=118, FORK_LINE_COMMENT=119, + FORK_MULTILINE_COMMENT=120, GROUP=121, SCORE=122, KEY=123, FUSE_LINE_COMMENT=124, + FUSE_MULTILINE_COMMENT=125, FUSE_WS=126, INLINE_STATS=127, INLINE_LINE_COMMENT=128, + INLINE_MULTILINE_COMMENT=129, INLINE_WS=130, JOIN=131, USING=132, JOIN_LINE_COMMENT=133, + JOIN_MULTILINE_COMMENT=134, JOIN_WS=135, LOOKUP_LINE_COMMENT=136, LOOKUP_MULTILINE_COMMENT=137, + LOOKUP_WS=138, LOOKUP_FIELD_LINE_COMMENT=139, LOOKUP_FIELD_MULTILINE_COMMENT=140, + LOOKUP_FIELD_WS=141, MMR_LIMIT=142, MMR_LINE_COMMENT=143, MMR_MULTILINE_COMMENT=144, + MMR_WS=145, MVEXPAND_LINE_COMMENT=146, MVEXPAND_MULTILINE_COMMENT=147, + MVEXPAND_WS=148, ID_PATTERN=149, PROJECT_LINE_COMMENT=150, PROJECT_MULTILINE_COMMENT=151, + PROJECT_WS=152, PROMQL_PARAMS_LINE_COMMENT=153, PROMQL_PARAMS_MULTILINE_COMMENT=154, + PROMQL_PARAMS_WS=155, PROMQL_QUERY_COMMENT=156, PROMQL_SINGLE_QUOTED_STRING=157, + PROMQL_OTHER_QUERY_CONTENT=158, AS=159, RENAME_LINE_COMMENT=160, RENAME_MULTILINE_COMMENT=161, + RENAME_WS=162, SET_LINE_COMMENT=163, SET_MULTILINE_COMMENT=164, SET_WS=165, + INFO=166, SHOW_LINE_COMMENT=167, SHOW_MULTILINE_COMMENT=168, SHOW_WS=169; public static final int RULE_statements = 0, RULE_singleStatement = 1, RULE_query = 2, RULE_sourceCommand = 3, RULE_processingCommand = 4, RULE_whereCommand = 5, RULE_dataType = 6, @@ -85,19 +85,19 @@ public class EsqlBaseParser extends ParserConfig { RULE_inlineStatsCommand = 67, RULE_fuseCommand = 68, RULE_fuseConfiguration = 69, RULE_fuseKeyByFields = 70, RULE_metricsInfoCommand = 71, RULE_tsInfoCommand = 72, RULE_lookupCommand = 73, RULE_insistCommand = 74, RULE_uriPartsCommand = 75, - RULE_registeredDomainCommand = 76, RULE_setCommand = 77, RULE_setField = 78, - RULE_mmrCommand = 79, RULE_mmrQueryVectorParams = 80, RULE_booleanExpression = 81, - RULE_regexBooleanExpression = 82, RULE_matchBooleanExpression = 83, RULE_valueExpression = 84, - RULE_operatorExpression = 85, RULE_primaryExpression = 86, RULE_functionExpression = 87, - RULE_functionName = 88, RULE_mapExpression = 89, RULE_entryExpression = 90, - RULE_mapValue = 91, RULE_constant = 92, RULE_booleanValue = 93, RULE_numericValue = 94, - RULE_decimalValue = 95, RULE_integerValue = 96, RULE_string = 97, RULE_comparisonOperator = 98, - RULE_joinCommand = 99, RULE_joinTarget = 100, RULE_joinCondition = 101, - RULE_promqlCommand = 102, RULE_valueName = 103, RULE_promqlParam = 104, - RULE_promqlParamName = 105, RULE_promqlParamValue = 106, RULE_promqlQueryContent = 107, - RULE_promqlQueryPart = 108, RULE_promqlIndexPattern = 109, RULE_promqlClusterString = 110, - RULE_promqlSelectorString = 111, RULE_promqlUnquotedIndexString = 112, - RULE_promqlIndexString = 113; + RULE_registeredDomainCommand = 76, RULE_userAgentCommand = 77, RULE_setCommand = 78, + RULE_setField = 79, RULE_mmrCommand = 80, RULE_mmrQueryVectorParams = 81, + RULE_booleanExpression = 82, RULE_regexBooleanExpression = 83, RULE_matchBooleanExpression = 84, + RULE_valueExpression = 85, RULE_operatorExpression = 86, RULE_primaryExpression = 87, + RULE_functionExpression = 88, RULE_functionName = 89, RULE_mapExpression = 90, + RULE_entryExpression = 91, RULE_mapValue = 92, RULE_constant = 93, RULE_booleanValue = 94, + RULE_numericValue = 95, RULE_decimalValue = 96, RULE_integerValue = 97, + RULE_string = 98, RULE_comparisonOperator = 99, RULE_joinCommand = 100, + RULE_joinTarget = 101, RULE_joinCondition = 102, RULE_promqlCommand = 103, + RULE_valueName = 104, RULE_promqlParam = 105, RULE_promqlParamName = 106, + RULE_promqlParamValue = 107, RULE_promqlQueryContent = 108, RULE_promqlQueryPart = 109, + RULE_promqlIndexPattern = 110, RULE_promqlClusterString = 111, RULE_promqlSelectorString = 112, + RULE_promqlUnquotedIndexString = 113, RULE_promqlIndexString = 114; private static String[] makeRuleNames() { return new String[] { "statements", "singleStatement", "query", "sourceCommand", "processingCommand", @@ -118,13 +118,13 @@ private static String[] makeRuleNames() { "rerankCommand", "completionCommand", "inlineStatsCommand", "fuseCommand", "fuseConfiguration", "fuseKeyByFields", "metricsInfoCommand", "tsInfoCommand", "lookupCommand", "insistCommand", "uriPartsCommand", "registeredDomainCommand", - "setCommand", "setField", "mmrCommand", "mmrQueryVectorParams", "booleanExpression", - "regexBooleanExpression", "matchBooleanExpression", "valueExpression", - "operatorExpression", "primaryExpression", "functionExpression", "functionName", - "mapExpression", "entryExpression", "mapValue", "constant", "booleanValue", - "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", - "joinCommand", "joinTarget", "joinCondition", "promqlCommand", "valueName", - "promqlParam", "promqlParamName", "promqlParamValue", "promqlQueryContent", + "userAgentCommand", "setCommand", "setField", "mmrCommand", "mmrQueryVectorParams", + "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", + "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", + "functionName", "mapExpression", "entryExpression", "mapValue", "constant", + "booleanValue", "numericValue", "decimalValue", "integerValue", "string", + "comparisonOperator", "joinCommand", "joinTarget", "joinCondition", "promqlCommand", + "valueName", "promqlParam", "promqlParamName", "promqlParamValue", "promqlQueryContent", "promqlQueryPart", "promqlIndexPattern", "promqlClusterString", "promqlSelectorString", "promqlUnquotedIndexString", "promqlIndexString" }; @@ -136,17 +136,17 @@ private static String[] makeLiteralNames() { null, null, null, null, "'change_point'", "'enrich'", null, "'completion'", "'dissect'", "'eval'", "'grok'", "'limit'", "'rerank'", "'row'", "'sample'", "'sort'", null, "'where'", "'uri_parts'", "'metrics_info'", "'registered_domain'", - "'ts_info'", "'from'", "'ts'", null, "'fork'", "'fuse'", "'inline'", - "'inlinestats'", "'lookup'", null, null, null, null, "'mmr'", "'mv_expand'", - "'drop'", "'keep'", null, "'promql'", "'rename'", "'set'", "'show'", - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, "'|'", null, null, null, "'and'", "'asc'", "'='", "'by'", - "'::'", "':'", "';'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", - "'is'", "'last'", "'like'", "'not'", "'null'", "'nulls'", "'on'", "'or'", - "'?'", "'rlike'", "'true'", "'with'", "'=='", "'=~'", "'!='", "'<'", - "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", "'}'", - "'??'", null, null, null, "']'", null, "')'", null, null, null, null, - null, "'metadata'", null, null, null, null, null, null, null, "'group'", + "'ts_info'", "'user_agent'", "'from'", "'ts'", null, "'fork'", "'fuse'", + "'inline'", "'inlinestats'", "'lookup'", null, null, null, null, "'mmr'", + "'mv_expand'", "'drop'", "'keep'", null, "'promql'", "'rename'", "'set'", + "'show'", null, null, null, null, null, null, null, null, null, null, + null, null, null, null, "'|'", null, null, null, "'and'", "'asc'", "'='", + "'by'", "'::'", "':'", "';'", "','", "'desc'", "'.'", "'false'", "'first'", + "'in'", "'is'", "'last'", "'like'", "'not'", "'null'", "'nulls'", "'on'", + "'or'", "'?'", "'rlike'", "'true'", "'with'", "'=='", "'=~'", "'!='", + "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", "'{'", + "'}'", "'??'", null, null, null, "']'", null, "')'", null, null, null, + null, null, "'metadata'", null, null, null, null, null, null, null, "'group'", "'score'", "'key'", null, null, null, null, null, null, null, "'join'", "'USING'", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, @@ -159,36 +159,37 @@ private static String[] makeSymbolicNames() { null, "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "CHANGE_POINT", "ENRICH", "DEV_EXPLAIN", "COMPLETION", "DISSECT", "EVAL", "GROK", "LIMIT", "RERANK", "ROW", "SAMPLE", "SORT", "STATS", "WHERE", "URI_PARTS", "METRICS_INFO", - "REGISTERED_DOMAIN", "TS_INFO", "FROM", "TS", "DEV_EXTERNAL", "FORK", - "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", - "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MMR", "MV_EXPAND", "DROP", "KEEP", "DEV_INSIST", - "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", "CHANGE_POINT_LINE_COMMENT", - "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", "ENRICH_POLICY_NAME", - "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", - "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", - "EXPLAIN_MULTILINE_COMMENT", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", - "DECIMAL_LITERAL", "AND", "ASC", "ASSIGN", "BY", "CAST_OP", "COLON", - "SEMICOLON", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", - "LIKE", "NOT", "NULL", "NULLS", "ON", "OR", "PARAM", "RLIKE", "TRUE", - "WITH", "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", - "ASTERISK", "SLASH", "PERCENT", "LEFT_BRACES", "RIGHT_BRACES", "DOUBLE_PARAMS", - "NAMED_OR_POSITIONAL_PARAM", "NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "OPENING_BRACKET", - "CLOSING_BRACKET", "LP", "RP", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", - "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", - "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", - "FORK_WS", "FORK_LINE_COMMENT", "FORK_MULTILINE_COMMENT", "GROUP", "SCORE", - "KEY", "FUSE_LINE_COMMENT", "FUSE_MULTILINE_COMMENT", "FUSE_WS", "INLINE_STATS", - "INLINE_LINE_COMMENT", "INLINE_MULTILINE_COMMENT", "INLINE_WS", "JOIN", - "USING", "JOIN_LINE_COMMENT", "JOIN_MULTILINE_COMMENT", "JOIN_WS", "LOOKUP_LINE_COMMENT", - "LOOKUP_MULTILINE_COMMENT", "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", - "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", "MMR_LIMIT", "MMR_LINE_COMMENT", - "MMR_MULTILINE_COMMENT", "MMR_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "PROMQL_PARAMS_LINE_COMMENT", "PROMQL_PARAMS_MULTILINE_COMMENT", - "PROMQL_PARAMS_WS", "PROMQL_QUERY_COMMENT", "PROMQL_SINGLE_QUOTED_STRING", - "PROMQL_OTHER_QUERY_CONTENT", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "SET_LINE_COMMENT", "SET_MULTILINE_COMMENT", "SET_WS", "INFO", - "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS" + "REGISTERED_DOMAIN", "TS_INFO", "USER_AGENT", "FROM", "TS", "DEV_EXTERNAL", + "FORK", "FUSE", "INLINE", "INLINESTATS", "JOIN_LOOKUP", "DEV_JOIN_FULL", + "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "DEV_LOOKUP", "MMR", "MV_EXPAND", + "DROP", "KEEP", "DEV_INSIST", "PROMQL", "RENAME", "SET", "SHOW", "UNKNOWN_CMD", + "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS", + "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "AND", + "ASC", "ASSIGN", "BY", "CAST_OP", "COLON", "SEMICOLON", "COMMA", "DESC", + "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "NOT", "NULL", "NULLS", + "ON", "OR", "PARAM", "RLIKE", "TRUE", "WITH", "EQ", "CIEQ", "NEQ", "LT", + "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", "PERCENT", + "LEFT_BRACES", "RIGHT_BRACES", "DOUBLE_PARAMS", "NAMED_OR_POSITIONAL_PARAM", + "NAMED_OR_POSITIONAL_DOUBLE_PARAMS", "OPENING_BRACKET", "CLOSING_BRACKET", + "LP", "RP", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", "FROM_WS", "FORK_WS", "FORK_LINE_COMMENT", + "FORK_MULTILINE_COMMENT", "GROUP", "SCORE", "KEY", "FUSE_LINE_COMMENT", + "FUSE_MULTILINE_COMMENT", "FUSE_WS", "INLINE_STATS", "INLINE_LINE_COMMENT", + "INLINE_MULTILINE_COMMENT", "INLINE_WS", "JOIN", "USING", "JOIN_LINE_COMMENT", + "JOIN_MULTILINE_COMMENT", "JOIN_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "MMR_LIMIT", "MMR_LINE_COMMENT", "MMR_MULTILINE_COMMENT", + "MMR_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", + "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", + "PROMQL_PARAMS_LINE_COMMENT", "PROMQL_PARAMS_MULTILINE_COMMENT", "PROMQL_PARAMS_WS", + "PROMQL_QUERY_COMMENT", "PROMQL_SINGLE_QUOTED_STRING", "PROMQL_OTHER_QUERY_CONTENT", + "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", + "SET_LINE_COMMENT", "SET_MULTILINE_COMMENT", "SET_WS", "INFO", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", "SHOW_WS" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -282,25 +283,25 @@ public final StatementsContext statements() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(231); + setState(233); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(228); + setState(230); setCommand(); } } } - setState(233); + setState(235); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); } - setState(234); + setState(236); singleStatement(); - setState(235); + setState(237); match(EOF); } } @@ -347,9 +348,9 @@ public final SingleStatementContext singleStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(237); + setState(239); query(0); - setState(238); + setState(240); match(EOF); } } @@ -445,11 +446,11 @@ private QueryContext query(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(241); + setState(243); sourceCommand(); } _ctx.stop = _input.LT(-1); - setState(248); + setState(250); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,1,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -460,16 +461,16 @@ private QueryContext query(int _p) throws RecognitionException { { _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_query); - setState(243); + setState(245); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(244); + setState(246); match(PIPE); - setState(245); + setState(247); processingCommand(); } } } - setState(250); + setState(252); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,1,_ctx); } @@ -533,59 +534,59 @@ public final SourceCommandContext sourceCommand() throws RecognitionException { SourceCommandContext _localctx = new SourceCommandContext(_ctx, getState()); enterRule(_localctx, 6, RULE_sourceCommand); try { - setState(260); + setState(262); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(251); + setState(253); fromCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(252); + setState(254); rowCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(253); + setState(255); showCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(254); + setState(256); timeSeriesCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(255); + setState(257); promqlCommand(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(256); + setState(258); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(257); + setState(259); explainCommand(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(258); + setState(260); if (!(this.isExternalDataSourcesEnabled())) throw new FailedPredicateException(this, "this.isExternalDataSourcesEnabled()"); - setState(259); + setState(261); externalCommand(); } break; @@ -676,6 +677,9 @@ public RegisteredDomainCommandContext registeredDomainCommand() { public TsInfoCommandContext tsInfoCommand() { return getRuleContext(TsInfoCommandContext.class,0); } + public UserAgentCommandContext userAgentCommand() { + return getRuleContext(UserAgentCommandContext.class,0); + } public MmrCommandContext mmrCommand() { return getRuleContext(MmrCommandContext.class,0); } @@ -709,199 +713,206 @@ public final ProcessingCommandContext processingCommand() throws RecognitionExce ProcessingCommandContext _localctx = new ProcessingCommandContext(_ctx, getState()); enterRule(_localctx, 8, RULE_processingCommand); try { - setState(291); + setState(294); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,3,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(262); + setState(264); evalCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(263); + setState(265); whereCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(264); + setState(266); keepCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(265); + setState(267); limitCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(266); + setState(268); statsCommand(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(267); + setState(269); sortCommand(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(268); + setState(270); dropCommand(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(269); + setState(271); renameCommand(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(270); + setState(272); dissectCommand(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(271); + setState(273); grokCommand(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(272); + setState(274); enrichCommand(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(273); + setState(275); mvExpandCommand(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(274); + setState(276); joinCommand(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(275); + setState(277); changePointCommand(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(276); + setState(278); completionCommand(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(277); + setState(279); sampleCommand(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(278); + setState(280); forkCommand(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(279); + setState(281); rerankCommand(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(280); + setState(282); inlineStatsCommand(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(281); + setState(283); fuseCommand(); } break; case 21: enterOuterAlt(_localctx, 21); { - setState(282); + setState(284); uriPartsCommand(); } break; case 22: enterOuterAlt(_localctx, 22); { - setState(283); + setState(285); metricsInfoCommand(); } break; case 23: enterOuterAlt(_localctx, 23); { - setState(284); + setState(286); registeredDomainCommand(); } break; case 24: enterOuterAlt(_localctx, 24); { - setState(285); + setState(287); tsInfoCommand(); } break; case 25: enterOuterAlt(_localctx, 25); { - setState(286); - mmrCommand(); + setState(288); + userAgentCommand(); } break; case 26: enterOuterAlt(_localctx, 26); { - setState(287); - if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(288); - lookupCommand(); + setState(289); + mmrCommand(); } break; case 27: enterOuterAlt(_localctx, 27); { - setState(289); - if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); setState(290); + if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); + setState(291); + lookupCommand(); + } + break; + case 28: + enterOuterAlt(_localctx, 28); + { + setState(292); + if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); + setState(293); insistCommand(); } break; @@ -950,9 +961,9 @@ public final WhereCommandContext whereCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(293); + setState(296); match(WHERE); - setState(294); + setState(297); booleanExpression(0); } } @@ -1010,7 +1021,7 @@ public final DataTypeContext dataType() throws RecognitionException { _localctx = new ToDataTypeContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(296); + setState(299); identifier(); } } @@ -1057,9 +1068,9 @@ public final RowCommandContext rowCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(298); + setState(301); match(ROW); - setState(299); + setState(302); fields(); } } @@ -1113,23 +1124,23 @@ public final FieldsContext fields() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(301); + setState(304); field(); - setState(306); + setState(309); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(302); + setState(305); match(COMMA); - setState(303); + setState(306); field(); } } } - setState(308); + setState(311); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); } @@ -1181,19 +1192,19 @@ public final FieldContext field() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(312); + setState(315); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { case 1: { - setState(309); + setState(312); qualifiedName(); - setState(310); + setState(313); match(ASSIGN); } break; } - setState(314); + setState(317); booleanExpression(0); } } @@ -1240,9 +1251,9 @@ public final FromCommandContext fromCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(316); + setState(319); match(FROM); - setState(317); + setState(320); indexPatternAndMetadataFields(); } } @@ -1289,9 +1300,9 @@ public final TimeSeriesCommandContext timeSeriesCommand() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(319); + setState(322); match(TS); - setState(320); + setState(323); indexPatternAndMetadataFields(); } } @@ -1341,11 +1352,11 @@ public final ExternalCommandContext externalCommand() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(322); + setState(325); match(DEV_EXTERNAL); - setState(323); + setState(326); stringOrParameter(); - setState(324); + setState(327); commandNamedParameters(); } } @@ -1402,32 +1413,32 @@ public final IndexPatternAndMetadataFieldsContext indexPatternAndMetadataFields( int _alt; enterOuterAlt(_localctx, 1); { - setState(326); + setState(329); indexPatternOrSubquery(); - setState(331); + setState(334); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,6,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(327); + setState(330); match(COMMA); - setState(328); + setState(331); indexPatternOrSubquery(); } } } - setState(333); + setState(336); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,6,_ctx); } - setState(335); + setState(338); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: { - setState(334); + setState(337); metadata(); } break; @@ -1477,21 +1488,21 @@ public final IndexPatternOrSubqueryContext indexPatternOrSubquery() throws Recog IndexPatternOrSubqueryContext _localctx = new IndexPatternOrSubqueryContext(_ctx, getState()); enterRule(_localctx, 28, RULE_indexPatternOrSubquery); try { - setState(339); + setState(342); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: case UNQUOTED_SOURCE: enterOuterAlt(_localctx, 1); { - setState(337); + setState(340); indexPattern(); } break; case LP: enterOuterAlt(_localctx, 2); { - setState(338); + setState(341); subquery(); } break; @@ -1554,27 +1565,27 @@ public final SubqueryContext subquery() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(341); + setState(344); match(LP); - setState(342); + setState(345); fromCommand(); - setState(347); + setState(350); _errHandler.sync(this); _la = _input.LA(1); while (_la==PIPE) { { { - setState(343); + setState(346); match(PIPE); - setState(344); + setState(347); processingCommand(); } } - setState(349); + setState(352); _errHandler.sync(this); _la = _input.LA(1); } - setState(350); + setState(353); match(RP); } } @@ -1629,34 +1640,34 @@ public final IndexPatternContext indexPattern() throws RecognitionException { IndexPatternContext _localctx = new IndexPatternContext(_ctx, getState()); enterRule(_localctx, 32, RULE_indexPattern); try { - setState(363); + setState(366); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(355); + setState(358); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(352); + setState(355); clusterString(); - setState(353); + setState(356); match(COLON); } break; } - setState(357); - unquotedIndexString(); setState(360); + unquotedIndexString(); + setState(363); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: { - setState(358); + setState(361); match(CAST_OP); - setState(359); + setState(362); selectorString(); } break; @@ -1666,7 +1677,7 @@ public final IndexPatternContext indexPattern() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(362); + setState(365); indexString(); } break; @@ -1712,7 +1723,7 @@ public final ClusterStringContext clusterString() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(365); + setState(368); match(UNQUOTED_SOURCE); } } @@ -1756,7 +1767,7 @@ public final SelectorStringContext selectorString() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(367); + setState(370); match(UNQUOTED_SOURCE); } } @@ -1800,7 +1811,7 @@ public final UnquotedIndexStringContext unquotedIndexString() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(369); + setState(372); match(UNQUOTED_SOURCE); } } @@ -1846,7 +1857,7 @@ public final IndexStringContext indexString() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(371); + setState(374); _la = _input.LA(1); if ( !(_la==QUOTED_STRING || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -1907,25 +1918,25 @@ public final MetadataContext metadata() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(373); + setState(376); match(METADATA); - setState(374); + setState(377); match(UNQUOTED_SOURCE); - setState(379); + setState(382); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,13,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(375); + setState(378); match(COMMA); - setState(376); + setState(379); match(UNQUOTED_SOURCE); } } } - setState(381); + setState(384); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,13,_ctx); } @@ -1974,9 +1985,9 @@ public final EvalCommandContext evalCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(382); + setState(385); match(EVAL); - setState(383); + setState(386); fields(); } } @@ -2029,26 +2040,26 @@ public final StatsCommandContext statsCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(385); + setState(388); match(STATS); - setState(387); + setState(390); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { - setState(386); + setState(389); ((StatsCommandContext)_localctx).stats = aggFields(); } break; } - setState(391); + setState(394); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(389); + setState(392); match(BY); - setState(390); + setState(393); ((StatsCommandContext)_localctx).grouping = fields(); } break; @@ -2105,23 +2116,23 @@ public final AggFieldsContext aggFields() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(393); + setState(396); aggField(); - setState(398); + setState(401); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,16,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(394); + setState(397); match(COMMA); - setState(395); + setState(398); aggField(); } } } - setState(400); + setState(403); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,16,_ctx); } @@ -2173,16 +2184,16 @@ public final AggFieldContext aggField() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(401); - field(); setState(404); + field(); + setState(407); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { case 1: { - setState(402); + setState(405); match(WHERE); - setState(403); + setState(406); booleanExpression(0); } break; @@ -2242,42 +2253,42 @@ public final QualifiedNameContext qualifiedName() throws RecognitionException { enterRule(_localctx, 52, RULE_qualifiedName); int _la; try { - setState(418); + setState(421); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(406); + setState(409); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(407); + setState(410); match(OPENING_BRACKET); - setState(409); + setState(412); _errHandler.sync(this); _la = _input.LA(1); if (_la==UNQUOTED_IDENTIFIER) { { - setState(408); + setState(411); ((QualifiedNameContext)_localctx).qualifier = match(UNQUOTED_IDENTIFIER); } } - setState(411); + setState(414); match(CLOSING_BRACKET); - setState(412); + setState(415); match(DOT); - setState(413); + setState(416); match(OPENING_BRACKET); - setState(414); + setState(417); ((QualifiedNameContext)_localctx).name = fieldName(); - setState(415); + setState(418); match(CLOSING_BRACKET); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(417); + setState(420); ((QualifiedNameContext)_localctx).name = fieldName(); } break; @@ -2333,23 +2344,23 @@ public final FieldNameContext fieldName() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(420); + setState(423); identifierOrParameter(); - setState(425); + setState(428); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,20,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(421); + setState(424); match(DOT); - setState(422); + setState(425); identifierOrParameter(); } } } - setState(427); + setState(430); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,20,_ctx); } @@ -2408,42 +2419,42 @@ public final QualifiedNamePatternContext qualifiedNamePattern() throws Recogniti enterRule(_localctx, 56, RULE_qualifiedNamePattern); int _la; try { - setState(440); + setState(443); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(428); + setState(431); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(429); + setState(432); match(OPENING_BRACKET); - setState(431); + setState(434); _errHandler.sync(this); _la = _input.LA(1); if (_la==ID_PATTERN) { { - setState(430); + setState(433); ((QualifiedNamePatternContext)_localctx).qualifier = match(ID_PATTERN); } } - setState(433); + setState(436); match(CLOSING_BRACKET); - setState(434); + setState(437); match(DOT); - setState(435); + setState(438); match(OPENING_BRACKET); - setState(436); + setState(439); ((QualifiedNamePatternContext)_localctx).name = fieldNamePattern(); - setState(437); + setState(440); match(CLOSING_BRACKET); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(439); + setState(442); ((QualifiedNamePatternContext)_localctx).name = fieldNamePattern(); } break; @@ -2500,23 +2511,23 @@ public final FieldNamePatternContext fieldNamePattern() throws RecognitionExcept enterOuterAlt(_localctx, 1); { { - setState(442); + setState(445); identifierPattern(); - setState(447); + setState(450); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(443); + setState(446); match(DOT); - setState(444); + setState(447); identifierPattern(); } } } - setState(449); + setState(452); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } @@ -2573,23 +2584,23 @@ public final QualifiedNamePatternsContext qualifiedNamePatterns() throws Recogni int _alt; enterOuterAlt(_localctx, 1); { - setState(450); + setState(453); qualifiedNamePattern(); - setState(455); + setState(458); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,24,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(451); + setState(454); match(COMMA); - setState(452); + setState(455); qualifiedNamePattern(); } } } - setState(457); + setState(460); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,24,_ctx); } @@ -2637,7 +2648,7 @@ public final IdentifierContext identifier() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(458); + setState(461); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -2693,13 +2704,13 @@ public final IdentifierPatternContext identifierPattern() throws RecognitionExce IdentifierPatternContext _localctx = new IdentifierPatternContext(_ctx, getState()); enterRule(_localctx, 64, RULE_identifierPattern); try { - setState(463); + setState(466); _errHandler.sync(this); switch (_input.LA(1)) { case ID_PATTERN: enterOuterAlt(_localctx, 1); { - setState(460); + setState(463); match(ID_PATTERN); } break; @@ -2707,7 +2718,7 @@ public final IdentifierPatternContext identifierPattern() throws RecognitionExce case NAMED_OR_POSITIONAL_PARAM: enterOuterAlt(_localctx, 2); { - setState(461); + setState(464); parameter(); } break; @@ -2715,7 +2726,7 @@ public final IdentifierPatternContext identifierPattern() throws RecognitionExce case NAMED_OR_POSITIONAL_DOUBLE_PARAMS: enterOuterAlt(_localctx, 3); { - setState(462); + setState(465); doubleParameter(); } break; @@ -2791,14 +2802,14 @@ public final ParameterContext parameter() throws RecognitionException { ParameterContext _localctx = new ParameterContext(_ctx, getState()); enterRule(_localctx, 66, RULE_parameter); try { - setState(467); + setState(470); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: _localctx = new InputParamContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(465); + setState(468); match(PARAM); } break; @@ -2806,7 +2817,7 @@ public final ParameterContext parameter() throws RecognitionException { _localctx = new InputNamedOrPositionalParamContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(466); + setState(469); match(NAMED_OR_POSITIONAL_PARAM); } break; @@ -2882,14 +2893,14 @@ public final DoubleParameterContext doubleParameter() throws RecognitionExceptio DoubleParameterContext _localctx = new DoubleParameterContext(_ctx, getState()); enterRule(_localctx, 68, RULE_doubleParameter); try { - setState(471); + setState(474); _errHandler.sync(this); switch (_input.LA(1)) { case DOUBLE_PARAMS: _localctx = new InputDoubleParamsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(469); + setState(472); match(DOUBLE_PARAMS); } break; @@ -2897,7 +2908,7 @@ public final DoubleParameterContext doubleParameter() throws RecognitionExceptio _localctx = new InputNamedOrPositionalDoubleParamsContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(470); + setState(473); match(NAMED_OR_POSITIONAL_DOUBLE_PARAMS); } break; @@ -2951,14 +2962,14 @@ public final IdentifierOrParameterContext identifierOrParameter() throws Recogni IdentifierOrParameterContext _localctx = new IdentifierOrParameterContext(_ctx, getState()); enterRule(_localctx, 70, RULE_identifierOrParameter); try { - setState(476); + setState(479); _errHandler.sync(this); switch (_input.LA(1)) { case UNQUOTED_IDENTIFIER: case QUOTED_IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(473); + setState(476); identifier(); } break; @@ -2966,7 +2977,7 @@ public final IdentifierOrParameterContext identifierOrParameter() throws Recogni case NAMED_OR_POSITIONAL_PARAM: enterOuterAlt(_localctx, 2); { - setState(474); + setState(477); parameter(); } break; @@ -2974,7 +2985,7 @@ public final IdentifierOrParameterContext identifierOrParameter() throws Recogni case NAMED_OR_POSITIONAL_DOUBLE_PARAMS: enterOuterAlt(_localctx, 3); { - setState(475); + setState(478); doubleParameter(); } break; @@ -3025,13 +3036,13 @@ public final StringOrParameterContext stringOrParameter() throws RecognitionExce StringOrParameterContext _localctx = new StringOrParameterContext(_ctx, getState()); enterRule(_localctx, 72, RULE_stringOrParameter); try { - setState(480); + setState(483); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: enterOuterAlt(_localctx, 1); { - setState(478); + setState(481); string(); } break; @@ -3039,7 +3050,7 @@ public final StringOrParameterContext stringOrParameter() throws RecognitionExce case NAMED_OR_POSITIONAL_PARAM: enterOuterAlt(_localctx, 2); { - setState(479); + setState(482); parameter(); } break; @@ -3093,16 +3104,16 @@ public final LimitCommandContext limitCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(482); + setState(485); match(LIMIT); - setState(483); + setState(486); constant(); - setState(485); + setState(488); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { case 1: { - setState(484); + setState(487); limitByGroupKey(); } break; @@ -3160,27 +3171,27 @@ public final LimitByGroupKeyContext limitByGroupKey() throws RecognitionExceptio int _alt; enterOuterAlt(_localctx, 1); { - setState(487); + setState(490); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(488); + setState(491); match(BY); - setState(489); + setState(492); booleanExpression(0); - setState(494); + setState(497); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,31,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(490); + setState(493); match(COMMA); - setState(491); + setState(494); booleanExpression(0); } } } - setState(496); + setState(499); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,31,_ctx); } @@ -3237,25 +3248,25 @@ public final SortCommandContext sortCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(497); + setState(500); match(SORT); - setState(498); + setState(501); orderExpression(); - setState(503); + setState(506); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(499); + setState(502); match(COMMA); - setState(500); + setState(503); orderExpression(); } } } - setState(505); + setState(508); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,32,_ctx); } @@ -3311,14 +3322,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(506); + setState(509); booleanExpression(0); - setState(508); + setState(511); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { case 1: { - setState(507); + setState(510); ((OrderExpressionContext)_localctx).ordering = _input.LT(1); _la = _input.LA(1); if ( !(_la==ASC || _la==DESC) ) { @@ -3332,14 +3343,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio } break; } - setState(512); + setState(515); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { case 1: { - setState(510); + setState(513); match(NULLS); - setState(511); + setState(514); ((OrderExpressionContext)_localctx).nullOrdering = _input.LT(1); _la = _input.LA(1); if ( !(_la==FIRST || _la==LAST) ) { @@ -3398,9 +3409,9 @@ public final KeepCommandContext keepCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(514); + setState(517); match(KEEP); - setState(515); + setState(518); qualifiedNamePatterns(); } } @@ -3447,9 +3458,9 @@ public final DropCommandContext dropCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(517); + setState(520); match(DROP); - setState(518); + setState(521); qualifiedNamePatterns(); } } @@ -3504,25 +3515,25 @@ public final RenameCommandContext renameCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(520); + setState(523); match(RENAME); - setState(521); + setState(524); renameClause(); - setState(526); + setState(529); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(522); + setState(525); match(COMMA); - setState(523); + setState(526); renameClause(); } } } - setState(528); + setState(531); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } @@ -3575,28 +3586,28 @@ public final RenameClauseContext renameClause() throws RecognitionException { RenameClauseContext _localctx = new RenameClauseContext(_ctx, getState()); enterRule(_localctx, 88, RULE_renameClause); try { - setState(537); + setState(540); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(529); + setState(532); ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); - setState(530); + setState(533); match(AS); - setState(531); + setState(534); ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(533); + setState(536); ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); - setState(534); + setState(537); match(ASSIGN); - setState(535); + setState(538); ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); } break; @@ -3651,18 +3662,18 @@ public final DissectCommandContext dissectCommand() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(539); + setState(542); match(DISSECT); - setState(540); + setState(543); primaryExpression(0); - setState(541); + setState(544); string(); - setState(543); + setState(546); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(542); + setState(545); dissectCommandOptions(); } break; @@ -3719,23 +3730,23 @@ public final DissectCommandOptionsContext dissectCommandOptions() throws Recogni int _alt; enterOuterAlt(_localctx, 1); { - setState(545); + setState(548); dissectCommandOption(); - setState(550); + setState(553); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,38,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(546); + setState(549); match(COMMA); - setState(547); + setState(550); dissectCommandOption(); } } } - setState(552); + setState(555); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,38,_ctx); } @@ -3787,11 +3798,11 @@ public final DissectCommandOptionContext dissectCommandOption() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(553); + setState(556); identifier(); - setState(554); + setState(557); match(ASSIGN); - setState(555); + setState(558); constant(); } } @@ -3838,14 +3849,14 @@ public final CommandNamedParametersContext commandNamedParameters() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(559); + setState(562); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { - setState(557); + setState(560); match(WITH); - setState(558); + setState(561); mapExpression(); } break; @@ -3906,27 +3917,27 @@ public final GrokCommandContext grokCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(561); + setState(564); match(GROK); - setState(562); + setState(565); primaryExpression(0); - setState(563); + setState(566); string(); - setState(568); + setState(571); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,40,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(564); + setState(567); match(COMMA); - setState(565); + setState(568); string(); } } } - setState(570); + setState(573); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,40,_ctx); } @@ -3975,9 +3986,9 @@ public final MvExpandCommandContext mvExpandCommand() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(571); + setState(574); match(MV_EXPAND); - setState(572); + setState(575); qualifiedName(); } } @@ -4024,9 +4035,9 @@ public final ExplainCommandContext explainCommand() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(574); + setState(577); match(DEV_EXPLAIN); - setState(575); + setState(578); subqueryExpression(); } } @@ -4074,11 +4085,11 @@ public final SubqueryExpressionContext subqueryExpression() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(577); + setState(580); match(LP); - setState(578); + setState(581); query(0); - setState(579); + setState(582); match(RP); } } @@ -4135,9 +4146,9 @@ public final ShowCommandContext showCommand() throws RecognitionException { _localctx = new ShowInfoContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(581); + setState(584); match(SHOW); - setState(582); + setState(585); match(INFO); } } @@ -4202,46 +4213,46 @@ public final EnrichCommandContext enrichCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(584); + setState(587); match(ENRICH); - setState(585); - ((EnrichCommandContext)_localctx).policyName = enrichPolicyName(); setState(588); + ((EnrichCommandContext)_localctx).policyName = enrichPolicyName(); + setState(591); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { case 1: { - setState(586); + setState(589); match(ON); - setState(587); + setState(590); ((EnrichCommandContext)_localctx).matchField = qualifiedNamePattern(); } break; } - setState(599); + setState(602); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: { - setState(590); + setState(593); match(WITH); - setState(591); + setState(594); enrichWithClause(); - setState(596); + setState(599); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,42,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(592); + setState(595); match(COMMA); - setState(593); + setState(596); enrichWithClause(); } } } - setState(598); + setState(601); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,42,_ctx); } @@ -4292,7 +4303,7 @@ public final EnrichPolicyNameContext enrichPolicyName() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(601); + setState(604); _la = _input.LA(1); if ( !(_la==ENRICH_POLICY_NAME || _la==QUOTED_STRING) ) { _errHandler.recoverInline(this); @@ -4352,19 +4363,19 @@ public final EnrichWithClauseContext enrichWithClause() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(606); + setState(609); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { case 1: { - setState(603); + setState(606); ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); - setState(604); + setState(607); match(ASSIGN); } break; } - setState(608); + setState(611); ((EnrichWithClauseContext)_localctx).enrichField = qualifiedNamePattern(); } } @@ -4412,9 +4423,9 @@ public final SampleCommandContext sampleCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(610); + setState(613); match(SAMPLE); - setState(611); + setState(614); ((SampleCommandContext)_localctx).probability = constant(); } } @@ -4469,23 +4480,23 @@ public final ChangePointCommandContext changePointCommand() throws RecognitionEx int _alt; enterOuterAlt(_localctx, 1); { - setState(613); + setState(616); match(CHANGE_POINT); - setState(614); + setState(617); ((ChangePointCommandContext)_localctx).value = qualifiedName(); - setState(618); + setState(621); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,45,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(615); + setState(618); changePointConfiguration(); } } } - setState(620); + setState(623); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,45,_ctx); } @@ -4540,28 +4551,28 @@ public final ChangePointConfigurationContext changePointConfiguration() throws R ChangePointConfigurationContext _localctx = new ChangePointConfigurationContext(_ctx, getState()); enterRule(_localctx, 118, RULE_changePointConfiguration); try { - setState(628); + setState(631); _errHandler.sync(this); switch (_input.LA(1)) { case ON: enterOuterAlt(_localctx, 1); { - setState(621); + setState(624); match(ON); - setState(622); + setState(625); ((ChangePointConfigurationContext)_localctx).key = qualifiedName(); } break; case AS: enterOuterAlt(_localctx, 2); { - setState(623); + setState(626); match(AS); - setState(624); + setState(627); ((ChangePointConfigurationContext)_localctx).targetType = qualifiedName(); - setState(625); + setState(628); match(COMMA); - setState(626); + setState(629); ((ChangePointConfigurationContext)_localctx).targetPvalue = qualifiedName(); } break; @@ -4612,9 +4623,9 @@ public final ForkCommandContext forkCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(630); + setState(633); match(FORK); - setState(631); + setState(634); forkSubQueries(); } } @@ -4664,7 +4675,7 @@ public final ForkSubQueriesContext forkSubQueries() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(634); + setState(637); _errHandler.sync(this); _alt = 1; do { @@ -4672,7 +4683,7 @@ public final ForkSubQueriesContext forkSubQueries() throws RecognitionException case 1: { { - setState(633); + setState(636); forkSubQuery(); } } @@ -4680,7 +4691,7 @@ public final ForkSubQueriesContext forkSubQueries() throws RecognitionException default: throw new NoViableAltException(this); } - setState(636); + setState(639); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,47,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -4730,11 +4741,11 @@ public final ForkSubQueryContext forkSubQuery() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(638); + setState(641); match(LP); - setState(639); + setState(642); forkSubQueryCommand(0); - setState(640); + setState(643); match(RP); } } @@ -4830,11 +4841,11 @@ private ForkSubQueryCommandContext forkSubQueryCommand(int _p) throws Recognitio _ctx = _localctx; _prevctx = _localctx; - setState(643); + setState(646); forkSubQueryProcessingCommand(); } _ctx.stop = _input.LT(-1); - setState(650); + setState(653); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,48,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -4845,16 +4856,16 @@ private ForkSubQueryCommandContext forkSubQueryCommand(int _p) throws Recognitio { _localctx = new CompositeForkSubQueryContext(new ForkSubQueryCommandContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_forkSubQueryCommand); - setState(645); + setState(648); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(646); + setState(649); match(PIPE); - setState(647); + setState(650); forkSubQueryProcessingCommand(); } } } - setState(652); + setState(655); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,48,_ctx); } @@ -4902,7 +4913,7 @@ public final ForkSubQueryProcessingCommandContext forkSubQueryProcessingCommand( try { enterOuterAlt(_localctx, 1); { - setState(653); + setState(656); processingCommand(); } } @@ -4963,27 +4974,27 @@ public final RerankCommandContext rerankCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(655); + setState(658); match(RERANK); - setState(659); + setState(662); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: { - setState(656); + setState(659); ((RerankCommandContext)_localctx).targetField = qualifiedName(); - setState(657); + setState(660); match(ASSIGN); } break; } - setState(661); + setState(664); ((RerankCommandContext)_localctx).queryText = constant(); - setState(662); + setState(665); match(ON); - setState(663); + setState(666); ((RerankCommandContext)_localctx).rerankFields = fields(); - setState(664); + setState(667); commandNamedParameters(); } } @@ -5039,23 +5050,23 @@ public final CompletionCommandContext completionCommand() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(666); + setState(669); match(COMPLETION); - setState(670); + setState(673); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(667); + setState(670); ((CompletionCommandContext)_localctx).targetField = qualifiedName(); - setState(668); + setState(671); match(ASSIGN); } break; } - setState(672); + setState(675); ((CompletionCommandContext)_localctx).prompt = primaryExpression(0); - setState(673); + setState(676); commandNamedParameters(); } } @@ -5108,26 +5119,26 @@ public final InlineStatsCommandContext inlineStatsCommand() throws RecognitionEx InlineStatsCommandContext _localctx = new InlineStatsCommandContext(_ctx, getState()); enterRule(_localctx, 134, RULE_inlineStatsCommand); try { - setState(688); + setState(691); _errHandler.sync(this); switch (_input.LA(1)) { case INLINE: enterOuterAlt(_localctx, 1); { - setState(675); + setState(678); match(INLINE); - setState(676); + setState(679); match(INLINE_STATS); - setState(677); - ((InlineStatsCommandContext)_localctx).stats = aggFields(); setState(680); + ((InlineStatsCommandContext)_localctx).stats = aggFields(); + setState(683); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { case 1: { - setState(678); + setState(681); match(BY); - setState(679); + setState(682); ((InlineStatsCommandContext)_localctx).grouping = fields(); } break; @@ -5137,18 +5148,18 @@ public final InlineStatsCommandContext inlineStatsCommand() throws RecognitionEx case INLINESTATS: enterOuterAlt(_localctx, 2); { - setState(682); + setState(685); match(INLINESTATS); - setState(683); - ((InlineStatsCommandContext)_localctx).stats = aggFields(); setState(686); + ((InlineStatsCommandContext)_localctx).stats = aggFields(); + setState(689); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(684); + setState(687); match(BY); - setState(685); + setState(688); ((InlineStatsCommandContext)_localctx).grouping = fields(); } break; @@ -5210,31 +5221,31 @@ public final FuseCommandContext fuseCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(690); + setState(693); match(FUSE); - setState(692); + setState(695); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(691); + setState(694); ((FuseCommandContext)_localctx).fuseType = identifier(); } break; } - setState(697); + setState(700); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,55,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(694); + setState(697); fuseConfiguration(); } } } - setState(699); + setState(702); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,55,_ctx); } @@ -5295,48 +5306,48 @@ public final FuseConfigurationContext fuseConfiguration() throws RecognitionExce FuseConfigurationContext _localctx = new FuseConfigurationContext(_ctx, getState()); enterRule(_localctx, 138, RULE_fuseConfiguration); try { - setState(711); + setState(714); _errHandler.sync(this); switch (_input.LA(1)) { case SCORE: enterOuterAlt(_localctx, 1); { - setState(700); + setState(703); match(SCORE); - setState(701); + setState(704); match(BY); - setState(702); + setState(705); ((FuseConfigurationContext)_localctx).score = qualifiedName(); } break; case KEY: enterOuterAlt(_localctx, 2); { - setState(703); + setState(706); match(KEY); - setState(704); + setState(707); match(BY); - setState(705); + setState(708); ((FuseConfigurationContext)_localctx).key = fuseKeyByFields(); } break; case GROUP: enterOuterAlt(_localctx, 3); { - setState(706); + setState(709); match(GROUP); - setState(707); + setState(710); match(BY); - setState(708); + setState(711); ((FuseConfigurationContext)_localctx).group = qualifiedName(); } break; case WITH: enterOuterAlt(_localctx, 4); { - setState(709); + setState(712); match(WITH); - setState(710); + setState(713); ((FuseConfigurationContext)_localctx).options = mapExpression(); } break; @@ -5394,23 +5405,23 @@ public final FuseKeyByFieldsContext fuseKeyByFields() throws RecognitionExceptio int _alt; enterOuterAlt(_localctx, 1); { - setState(713); + setState(716); qualifiedName(); - setState(718); + setState(721); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,57,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(714); + setState(717); match(COMMA); - setState(715); + setState(718); qualifiedName(); } } } - setState(720); + setState(723); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,57,_ctx); } @@ -5456,7 +5467,7 @@ public final MetricsInfoCommandContext metricsInfoCommand() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(721); + setState(724); match(METRICS_INFO); } } @@ -5500,7 +5511,7 @@ public final TsInfoCommandContext tsInfoCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(723); + setState(726); match(TS_INFO); } } @@ -5553,13 +5564,13 @@ public final LookupCommandContext lookupCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(725); + setState(728); match(DEV_LOOKUP); - setState(726); + setState(729); ((LookupCommandContext)_localctx).tableName = indexPattern(); - setState(727); + setState(730); match(ON); - setState(728); + setState(731); ((LookupCommandContext)_localctx).matchFields = qualifiedNamePatterns(); } } @@ -5606,9 +5617,9 @@ public final InsistCommandContext insistCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(730); + setState(733); match(DEV_INSIST); - setState(731); + setState(734); qualifiedNamePatterns(); } } @@ -5659,13 +5670,13 @@ public final UriPartsCommandContext uriPartsCommand() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(733); + setState(736); match(URI_PARTS); - setState(734); + setState(737); qualifiedName(); - setState(735); + setState(738); match(ASSIGN); - setState(736); + setState(739); primaryExpression(0); } } @@ -5716,14 +5727,76 @@ public final RegisteredDomainCommandContext registeredDomainCommand() throws Rec try { enterOuterAlt(_localctx, 1); { - setState(738); + setState(741); match(REGISTERED_DOMAIN); - setState(739); + setState(742); qualifiedName(); - setState(740); + setState(743); match(ASSIGN); - setState(741); + setState(744); + primaryExpression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class UserAgentCommandContext extends ParserRuleContext { + public TerminalNode USER_AGENT() { return getToken(EsqlBaseParser.USER_AGENT, 0); } + public QualifiedNameContext qualifiedName() { + return getRuleContext(QualifiedNameContext.class,0); + } + public TerminalNode ASSIGN() { return getToken(EsqlBaseParser.ASSIGN, 0); } + public PrimaryExpressionContext primaryExpression() { + return getRuleContext(PrimaryExpressionContext.class,0); + } + public CommandNamedParametersContext commandNamedParameters() { + return getRuleContext(CommandNamedParametersContext.class,0); + } + @SuppressWarnings("this-escape") + public UserAgentCommandContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_userAgentCommand; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterUserAgentCommand(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitUserAgentCommand(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitUserAgentCommand(this); + else return visitor.visitChildren(this); + } + } + + public final UserAgentCommandContext userAgentCommand() throws RecognitionException { + UserAgentCommandContext _localctx = new UserAgentCommandContext(_ctx, getState()); + enterRule(_localctx, 154, RULE_userAgentCommand); + try { + enterOuterAlt(_localctx, 1); + { + setState(746); + match(USER_AGENT); + setState(747); + qualifiedName(); + setState(748); + match(ASSIGN); + setState(749); primaryExpression(0); + setState(750); + commandNamedParameters(); } } catch (RecognitionException re) { @@ -5766,15 +5839,15 @@ public T accept(ParseTreeVisitor visitor) { public final SetCommandContext setCommand() throws RecognitionException { SetCommandContext _localctx = new SetCommandContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_setCommand); + enterRule(_localctx, 156, RULE_setCommand); try { enterOuterAlt(_localctx, 1); { - setState(743); + setState(752); match(SET); - setState(744); + setState(753); setField(); - setState(745); + setState(754); match(SEMICOLON); } } @@ -5823,15 +5896,15 @@ public T accept(ParseTreeVisitor visitor) { public final SetFieldContext setField() throws RecognitionException { SetFieldContext _localctx = new SetFieldContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_setField); + enterRule(_localctx, 158, RULE_setField); try { enterOuterAlt(_localctx, 1); { - setState(747); + setState(756); identifier(); - setState(748); + setState(757); match(ASSIGN); - setState(751); + setState(760); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -5846,13 +5919,13 @@ public final SetFieldContext setField() throws RecognitionException { case NAMED_OR_POSITIONAL_PARAM: case OPENING_BRACKET: { - setState(749); + setState(758); constant(); } break; case LEFT_BRACES: { - setState(750); + setState(759); mapExpression(); } break; @@ -5914,31 +5987,31 @@ public T accept(ParseTreeVisitor visitor) { public final MmrCommandContext mmrCommand() throws RecognitionException { MmrCommandContext _localctx = new MmrCommandContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_mmrCommand); + enterRule(_localctx, 160, RULE_mmrCommand); try { enterOuterAlt(_localctx, 1); { - setState(753); + setState(762); match(MMR); - setState(755); + setState(764); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { case 1: { - setState(754); + setState(763); ((MmrCommandContext)_localctx).queryVector = mmrQueryVectorParams(); } break; } - setState(757); + setState(766); match(ON); - setState(758); + setState(767); ((MmrCommandContext)_localctx).diversifyField = qualifiedName(); - setState(759); + setState(768); match(MMR_LIMIT); - setState(760); + setState(769); ((MmrCommandContext)_localctx).limitValue = integerValue(); - setState(761); + setState(770); commandNamedParameters(); } } @@ -6012,16 +6085,16 @@ public T accept(ParseTreeVisitor visitor) { public final MmrQueryVectorParamsContext mmrQueryVectorParams() throws RecognitionException { MmrQueryVectorParamsContext _localctx = new MmrQueryVectorParamsContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_mmrQueryVectorParams); + enterRule(_localctx, 162, RULE_mmrQueryVectorParams); try { - setState(765); + setState(774); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,60,_ctx) ) { case 1: _localctx = new MmrQueryVectorParameterContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(763); + setState(772); parameter(); } break; @@ -6029,7 +6102,7 @@ public final MmrQueryVectorParamsContext mmrQueryVectorParams() throws Recogniti _localctx = new MmrQueryVectorExpressionContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(764); + setState(773); primaryExpression(0); } break; @@ -6240,14 +6313,14 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc int _parentState = getState(); BooleanExpressionContext _localctx = new BooleanExpressionContext(_ctx, _parentState); BooleanExpressionContext _prevctx = _localctx; - int _startState = 162; - enterRecursionRule(_localctx, 162, RULE_booleanExpression, _p); + int _startState = 164; + enterRecursionRule(_localctx, 164, RULE_booleanExpression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(796); + setState(805); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { case 1: @@ -6256,9 +6329,9 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(768); + setState(777); match(NOT); - setState(769); + setState(778); booleanExpression(8); } break; @@ -6267,7 +6340,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new BooleanDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(770); + setState(779); valueExpression(); } break; @@ -6276,7 +6349,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new RegexExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(771); + setState(780); regexBooleanExpression(); } break; @@ -6285,41 +6358,41 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalInContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(772); + setState(781); valueExpression(); - setState(774); + setState(783); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(773); + setState(782); match(NOT); } } - setState(776); + setState(785); match(IN); - setState(777); + setState(786); match(LP); - setState(778); + setState(787); valueExpression(); - setState(783); + setState(792); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(779); + setState(788); match(COMMA); - setState(780); + setState(789); valueExpression(); } } - setState(785); + setState(794); _errHandler.sync(this); _la = _input.LA(1); } - setState(786); + setState(795); match(RP); } break; @@ -6328,21 +6401,21 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new IsNullContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(788); + setState(797); valueExpression(); - setState(789); + setState(798); match(IS); - setState(791); + setState(800); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(790); + setState(799); match(NOT); } } - setState(793); + setState(802); match(NULL); } break; @@ -6351,13 +6424,13 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new MatchExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(795); + setState(804); matchBooleanExpression(); } break; } _ctx.stop = _input.LT(-1); - setState(806); + setState(815); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,66,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6365,7 +6438,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(804); + setState(813); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: @@ -6373,11 +6446,11 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(798); + setState(807); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(799); + setState(808); ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(800); + setState(809); ((LogicalBinaryContext)_localctx).right = booleanExpression(6); } break; @@ -6386,18 +6459,18 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(801); + setState(810); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(802); + setState(811); ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(803); + setState(812); ((LogicalBinaryContext)_localctx).right = booleanExpression(5); } break; } } } - setState(808); + setState(817); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,66,_ctx); } @@ -6553,31 +6626,31 @@ public T accept(ParseTreeVisitor visitor) { public final RegexBooleanExpressionContext regexBooleanExpression() throws RecognitionException { RegexBooleanExpressionContext _localctx = new RegexBooleanExpressionContext(_ctx, getState()); - enterRule(_localctx, 164, RULE_regexBooleanExpression); + enterRule(_localctx, 166, RULE_regexBooleanExpression); int _la; try { - setState(855); + setState(864); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: _localctx = new LikeExpressionContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(809); + setState(818); valueExpression(); - setState(811); + setState(820); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(810); + setState(819); match(NOT); } } - setState(813); + setState(822); match(LIKE); - setState(814); + setState(823); stringOrParameter(); } break; @@ -6585,21 +6658,21 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new RlikeExpressionContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(816); + setState(825); valueExpression(); - setState(818); + setState(827); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(817); + setState(826); match(NOT); } } - setState(820); + setState(829); match(RLIKE); - setState(821); + setState(830); stringOrParameter(); } break; @@ -6607,41 +6680,41 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new LikeListExpressionContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(823); + setState(832); valueExpression(); - setState(825); + setState(834); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(824); + setState(833); match(NOT); } } - setState(827); + setState(836); match(LIKE); - setState(828); + setState(837); match(LP); - setState(829); + setState(838); stringOrParameter(); - setState(834); + setState(843); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(830); + setState(839); match(COMMA); - setState(831); + setState(840); stringOrParameter(); } } - setState(836); + setState(845); _errHandler.sync(this); _la = _input.LA(1); } - setState(837); + setState(846); match(RP); } break; @@ -6649,41 +6722,41 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog _localctx = new RlikeListExpressionContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(839); + setState(848); valueExpression(); - setState(841); + setState(850); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(840); + setState(849); match(NOT); } } - setState(843); + setState(852); match(RLIKE); - setState(844); + setState(853); match(LP); - setState(845); + setState(854); stringOrParameter(); - setState(850); + setState(859); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(846); + setState(855); match(COMMA); - setState(847); + setState(856); stringOrParameter(); } } - setState(852); + setState(861); _errHandler.sync(this); _la = _input.LA(1); } - setState(853); + setState(862); match(RP); } break; @@ -6738,28 +6811,28 @@ public T accept(ParseTreeVisitor visitor) { public final MatchBooleanExpressionContext matchBooleanExpression() throws RecognitionException { MatchBooleanExpressionContext _localctx = new MatchBooleanExpressionContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_matchBooleanExpression); + enterRule(_localctx, 168, RULE_matchBooleanExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(857); + setState(866); ((MatchBooleanExpressionContext)_localctx).fieldExp = qualifiedName(); - setState(860); + setState(869); _errHandler.sync(this); _la = _input.LA(1); if (_la==CAST_OP) { { - setState(858); + setState(867); match(CAST_OP); - setState(859); + setState(868); ((MatchBooleanExpressionContext)_localctx).fieldType = dataType(); } } - setState(862); + setState(871); match(COLON); - setState(863); + setState(872); ((MatchBooleanExpressionContext)_localctx).matchQuery = constant(); } } @@ -6841,16 +6914,16 @@ public T accept(ParseTreeVisitor visitor) { public final ValueExpressionContext valueExpression() throws RecognitionException { ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_valueExpression); + enterRule(_localctx, 170, RULE_valueExpression); try { - setState(870); + setState(879); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: _localctx = new ValueExpressionDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(865); + setState(874); operatorExpression(0); } break; @@ -6858,11 +6931,11 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio _localctx = new ComparisonContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(866); + setState(875); ((ComparisonContext)_localctx).left = operatorExpression(0); - setState(867); + setState(876); comparisonOperator(); - setState(868); + setState(877); ((ComparisonContext)_localctx).right = operatorExpression(0); } break; @@ -6980,14 +7053,14 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE int _parentState = getState(); OperatorExpressionContext _localctx = new OperatorExpressionContext(_ctx, _parentState); OperatorExpressionContext _prevctx = _localctx; - int _startState = 170; - enterRecursionRule(_localctx, 170, RULE_operatorExpression, _p); + int _startState = 172; + enterRecursionRule(_localctx, 172, RULE_operatorExpression, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(876); + setState(885); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { case 1: @@ -6996,7 +7069,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _ctx = _localctx; _prevctx = _localctx; - setState(873); + setState(882); primaryExpression(0); } break; @@ -7005,7 +7078,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(874); + setState(883); ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -7016,13 +7089,13 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(875); + setState(884); operatorExpression(3); } break; } _ctx.stop = _input.LT(-1); - setState(886); + setState(895); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,78,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -7030,7 +7103,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(884); + setState(893); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,77,_ctx) ) { case 1: @@ -7038,12 +7111,12 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(878); + setState(887); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(879); + setState(888); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 95)) & ~0x3f) == 0 && ((1L << (_la - 95)) & 7L) != 0)) ) { + if ( !(((((_la - 96)) & ~0x3f) == 0 && ((1L << (_la - 96)) & 7L) != 0)) ) { ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -7051,7 +7124,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(880); + setState(889); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); } break; @@ -7060,9 +7133,9 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(881); + setState(890); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(882); + setState(891); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -7073,14 +7146,14 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(883); + setState(892); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); } break; } } } - setState(888); + setState(897); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,78,_ctx); } @@ -7232,13 +7305,13 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc int _parentState = getState(); PrimaryExpressionContext _localctx = new PrimaryExpressionContext(_ctx, _parentState); PrimaryExpressionContext _prevctx = _localctx; - int _startState = 172; - enterRecursionRule(_localctx, 172, RULE_primaryExpression, _p); + int _startState = 174; + enterRecursionRule(_localctx, 174, RULE_primaryExpression, _p); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(897); + setState(906); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { case 1: @@ -7247,7 +7320,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(890); + setState(899); constant(); } break; @@ -7256,7 +7329,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new DereferenceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(891); + setState(900); qualifiedName(); } break; @@ -7265,7 +7338,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new FunctionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(892); + setState(901); functionExpression(); } break; @@ -7274,17 +7347,17 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new ParenthesizedExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(893); + setState(902); match(LP); - setState(894); + setState(903); booleanExpression(0); - setState(895); + setState(904); match(RP); } break; } _ctx.stop = _input.LT(-1); - setState(904); + setState(913); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,80,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -7295,16 +7368,16 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc { _localctx = new InlineCastContext(new PrimaryExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpression); - setState(899); + setState(908); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(900); + setState(909); match(CAST_OP); - setState(901); + setState(910); dataType(); } } } - setState(906); + setState(915); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,80,_ctx); } @@ -7364,56 +7437,56 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionExpressionContext functionExpression() throws RecognitionException { FunctionExpressionContext _localctx = new FunctionExpressionContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_functionExpression); + enterRule(_localctx, 176, RULE_functionExpression); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(907); + setState(916); functionName(); - setState(908); + setState(917); match(LP); - setState(922); + setState(931); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,83,_ctx) ) { case 1: { - setState(909); + setState(918); match(ASTERISK); } break; case 2: { { - setState(910); + setState(919); booleanExpression(0); - setState(915); + setState(924); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,81,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(911); + setState(920); match(COMMA); - setState(912); + setState(921); booleanExpression(0); } } } - setState(917); + setState(926); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,81,_ctx); } - setState(920); + setState(929); _errHandler.sync(this); _la = _input.LA(1); if (_la==COMMA) { { - setState(918); + setState(927); match(COMMA); - setState(919); + setState(928); mapExpression(); } } @@ -7422,7 +7495,7 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx } break; } - setState(924); + setState(933); match(RP); } } @@ -7466,9 +7539,9 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionNameContext functionName() throws RecognitionException { FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_functionName); + enterRule(_localctx, 178, RULE_functionName); try { - setState(929); + setState(938); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: @@ -7479,21 +7552,21 @@ public final FunctionNameContext functionName() throws RecognitionException { case QUOTED_IDENTIFIER: enterOuterAlt(_localctx, 1); { - setState(926); + setState(935); identifierOrParameter(); } break; case FIRST: enterOuterAlt(_localctx, 2); { - setState(927); + setState(936); match(FIRST); } break; case LAST: enterOuterAlt(_localctx, 3); { - setState(928); + setState(937); match(LAST); } break; @@ -7548,40 +7621,40 @@ public T accept(ParseTreeVisitor visitor) { public final MapExpressionContext mapExpression() throws RecognitionException { MapExpressionContext _localctx = new MapExpressionContext(_ctx, getState()); - enterRule(_localctx, 178, RULE_mapExpression); + enterRule(_localctx, 180, RULE_mapExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(931); - match(LEFT_BRACES); setState(940); + match(LEFT_BRACES); + setState(949); _errHandler.sync(this); _la = _input.LA(1); if (_la==QUOTED_STRING) { { - setState(932); + setState(941); entryExpression(); - setState(937); + setState(946); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(933); + setState(942); match(COMMA); - setState(934); + setState(943); entryExpression(); } } - setState(939); + setState(948); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(942); + setState(951); match(RIGHT_BRACES); } } @@ -7629,15 +7702,15 @@ public T accept(ParseTreeVisitor visitor) { public final EntryExpressionContext entryExpression() throws RecognitionException { EntryExpressionContext _localctx = new EntryExpressionContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_entryExpression); + enterRule(_localctx, 182, RULE_entryExpression); try { enterOuterAlt(_localctx, 1); { - setState(944); + setState(953); ((EntryExpressionContext)_localctx).key = string(); - setState(945); + setState(954); match(COLON); - setState(946); + setState(955); ((EntryExpressionContext)_localctx).value = mapValue(); } } @@ -7682,9 +7755,9 @@ public T accept(ParseTreeVisitor visitor) { public final MapValueContext mapValue() throws RecognitionException { MapValueContext _localctx = new MapValueContext(_ctx, getState()); - enterRule(_localctx, 182, RULE_mapValue); + enterRule(_localctx, 184, RULE_mapValue); try { - setState(950); + setState(959); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -7700,14 +7773,14 @@ public final MapValueContext mapValue() throws RecognitionException { case OPENING_BRACKET: enterOuterAlt(_localctx, 1); { - setState(948); + setState(957); constant(); } break; case LEFT_BRACES: enterOuterAlt(_localctx, 2); { - setState(949); + setState(958); mapExpression(); } break; @@ -7979,17 +8052,17 @@ public T accept(ParseTreeVisitor visitor) { public final ConstantContext constant() throws RecognitionException { ConstantContext _localctx = new ConstantContext(_ctx, getState()); - enterRule(_localctx, 184, RULE_constant); + enterRule(_localctx, 186, RULE_constant); int _la; try { - setState(994); + setState(1003); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) { case 1: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(952); + setState(961); match(NULL); } break; @@ -7997,9 +8070,9 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new QualifiedIntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(953); + setState(962); integerValue(); - setState(954); + setState(963); match(UNQUOTED_IDENTIFIER); } break; @@ -8007,7 +8080,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(956); + setState(965); decimalValue(); } break; @@ -8015,7 +8088,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(957); + setState(966); integerValue(); } break; @@ -8023,7 +8096,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(958); + setState(967); booleanValue(); } break; @@ -8031,7 +8104,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new InputParameterContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(959); + setState(968); parameter(); } break; @@ -8039,7 +8112,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(960); + setState(969); string(); } break; @@ -8047,27 +8120,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(961); + setState(970); match(OPENING_BRACKET); - setState(962); + setState(971); numericValue(); - setState(967); + setState(976); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(963); + setState(972); match(COMMA); - setState(964); + setState(973); numericValue(); } } - setState(969); + setState(978); _errHandler.sync(this); _la = _input.LA(1); } - setState(970); + setState(979); match(CLOSING_BRACKET); } break; @@ -8075,27 +8148,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(972); + setState(981); match(OPENING_BRACKET); - setState(973); + setState(982); booleanValue(); - setState(978); + setState(987); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(974); + setState(983); match(COMMA); - setState(975); + setState(984); booleanValue(); } } - setState(980); + setState(989); _errHandler.sync(this); _la = _input.LA(1); } - setState(981); + setState(990); match(CLOSING_BRACKET); } break; @@ -8103,27 +8176,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(983); + setState(992); match(OPENING_BRACKET); - setState(984); + setState(993); string(); - setState(989); + setState(998); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(985); + setState(994); match(COMMA); - setState(986); + setState(995); string(); } } - setState(991); + setState(1000); _errHandler.sync(this); _la = _input.LA(1); } - setState(992); + setState(1001); match(CLOSING_BRACKET); } break; @@ -8166,12 +8239,12 @@ public T accept(ParseTreeVisitor visitor) { public final BooleanValueContext booleanValue() throws RecognitionException { BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); - enterRule(_localctx, 186, RULE_booleanValue); + enterRule(_localctx, 188, RULE_booleanValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(996); + setState(1005); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -8224,22 +8297,22 @@ public T accept(ParseTreeVisitor visitor) { public final NumericValueContext numericValue() throws RecognitionException { NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); - enterRule(_localctx, 188, RULE_numericValue); + enterRule(_localctx, 190, RULE_numericValue); try { - setState(1000); + setState(1009); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,92,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(998); + setState(1007); decimalValue(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(999); + setState(1008); integerValue(); } break; @@ -8283,17 +8356,17 @@ public T accept(ParseTreeVisitor visitor) { public final DecimalValueContext decimalValue() throws RecognitionException { DecimalValueContext _localctx = new DecimalValueContext(_ctx, getState()); - enterRule(_localctx, 190, RULE_decimalValue); + enterRule(_localctx, 192, RULE_decimalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1003); + setState(1012); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(1002); + setState(1011); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -8306,7 +8379,7 @@ public final DecimalValueContext decimalValue() throws RecognitionException { } } - setState(1005); + setState(1014); match(DECIMAL_LITERAL); } } @@ -8348,17 +8421,17 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerValueContext integerValue() throws RecognitionException { IntegerValueContext _localctx = new IntegerValueContext(_ctx, getState()); - enterRule(_localctx, 192, RULE_integerValue); + enterRule(_localctx, 194, RULE_integerValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1008); + setState(1017); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(1007); + setState(1016); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -8371,7 +8444,7 @@ public final IntegerValueContext integerValue() throws RecognitionException { } } - setState(1010); + setState(1019); match(INTEGER_LITERAL); } } @@ -8411,11 +8484,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringContext string() throws RecognitionException { StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 194, RULE_string); + enterRule(_localctx, 196, RULE_string); try { enterOuterAlt(_localctx, 1); { - setState(1012); + setState(1021); match(QUOTED_STRING); } } @@ -8460,14 +8533,14 @@ public T accept(ParseTreeVisitor visitor) { public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); - enterRule(_localctx, 196, RULE_comparisonOperator); + enterRule(_localctx, 198, RULE_comparisonOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1014); + setState(1023); _la = _input.LA(1); - if ( !(((((_la - 86)) & ~0x3f) == 0 && ((1L << (_la - 86)) & 125L) != 0)) ) { + if ( !(((((_la - 87)) & ~0x3f) == 0 && ((1L << (_la - 87)) & 125L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -8523,15 +8596,15 @@ public T accept(ParseTreeVisitor visitor) { public final JoinCommandContext joinCommand() throws RecognitionException { JoinCommandContext _localctx = new JoinCommandContext(_ctx, getState()); - enterRule(_localctx, 198, RULE_joinCommand); + enterRule(_localctx, 200, RULE_joinCommand); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1016); + setState(1025); ((JoinCommandContext)_localctx).type = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 6979321856L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 13958643712L) != 0)) ) { ((JoinCommandContext)_localctx).type = (Token)_errHandler.recoverInline(this); } else { @@ -8539,11 +8612,11 @@ public final JoinCommandContext joinCommand() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(1017); + setState(1026); match(JOIN); - setState(1018); + setState(1027); joinTarget(); - setState(1019); + setState(1028); joinCondition(); } } @@ -8589,37 +8662,37 @@ public T accept(ParseTreeVisitor visitor) { public final JoinTargetContext joinTarget() throws RecognitionException { JoinTargetContext _localctx = new JoinTargetContext(_ctx, getState()); - enterRule(_localctx, 200, RULE_joinTarget); + enterRule(_localctx, 202, RULE_joinTarget); int _la; try { - setState(1029); + setState(1038); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1021); + setState(1030); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(1022); + setState(1031); ((JoinTargetContext)_localctx).index = indexPattern(); - setState(1024); + setState(1033); _errHandler.sync(this); _la = _input.LA(1); if (_la==AS) { { - setState(1023); + setState(1032); match(AS); } } - setState(1026); + setState(1035); ((JoinTargetContext)_localctx).qualifier = match(UNQUOTED_SOURCE); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1028); + setState(1037); ((JoinTargetContext)_localctx).index = indexPattern(); } break; @@ -8671,30 +8744,30 @@ public T accept(ParseTreeVisitor visitor) { public final JoinConditionContext joinCondition() throws RecognitionException { JoinConditionContext _localctx = new JoinConditionContext(_ctx, getState()); - enterRule(_localctx, 202, RULE_joinCondition); + enterRule(_localctx, 204, RULE_joinCondition); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(1031); + setState(1040); match(ON); - setState(1032); + setState(1041); booleanExpression(0); - setState(1037); + setState(1046); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,97,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1033); + setState(1042); match(COMMA); - setState(1034); + setState(1043); booleanExpression(0); } } } - setState(1039); + setState(1048); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,97,_ctx); } @@ -8755,166 +8828,166 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlCommandContext promqlCommand() throws RecognitionException { PromqlCommandContext _localctx = new PromqlCommandContext(_ctx, getState()); - enterRule(_localctx, 204, RULE_promqlCommand); + enterRule(_localctx, 206, RULE_promqlCommand); int _la; try { int _alt; - setState(1100); + setState(1109); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1040); + setState(1049); match(PROMQL); - setState(1044); + setState(1053); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,98,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1041); + setState(1050); promqlParam(); } } } - setState(1046); + setState(1055); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,98,_ctx); } - setState(1050); + setState(1059); _errHandler.sync(this); _la = _input.LA(1); if (_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) { { - setState(1047); + setState(1056); valueName(); - setState(1048); + setState(1057); match(ASSIGN); } } - setState(1052); + setState(1061); match(LP); - setState(1053); + setState(1062); match(NAMED_OR_POSITIONAL_PARAM); - setState(1054); + setState(1063); match(RP); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1055); + setState(1064); match(PROMQL); - setState(1059); + setState(1068); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1056); + setState(1065); promqlParam(); } } } - setState(1061); + setState(1070); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,100,_ctx); } - setState(1065); + setState(1074); _errHandler.sync(this); _la = _input.LA(1); if (_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) { { - setState(1062); + setState(1071); valueName(); - setState(1063); + setState(1072); match(ASSIGN); } } - setState(1067); + setState(1076); match(NAMED_OR_POSITIONAL_PARAM); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1068); + setState(1077); match(PROMQL); - setState(1072); + setState(1081); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,102,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1069); + setState(1078); promqlParam(); } } } - setState(1074); + setState(1083); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,102,_ctx); } - setState(1078); + setState(1087); _errHandler.sync(this); _la = _input.LA(1); if (_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) { { - setState(1075); + setState(1084); valueName(); - setState(1076); + setState(1085); match(ASSIGN); } } - setState(1080); + setState(1089); match(LP); - setState(1082); + setState(1091); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(1081); + setState(1090); promqlQueryPart(); } } - setState(1084); + setState(1093); _errHandler.sync(this); _la = _input.LA(1); - } while ( ((((_la - 58)) & ~0x3f) == 0 && ((1L << (_la - 58)) & 37867180460606881L) != 0) || ((((_la - 155)) & ~0x3f) == 0 && ((1L << (_la - 155)) & 7L) != 0) ); - setState(1086); + } while ( ((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 37867180460606881L) != 0) || ((((_la - 156)) & ~0x3f) == 0 && ((1L << (_la - 156)) & 7L) != 0) ); + setState(1095); match(RP); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(1088); + setState(1097); match(PROMQL); - setState(1092); + setState(1101); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,105,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1089); + setState(1098); promqlParam(); } } } - setState(1094); + setState(1103); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,105,_ctx); } - setState(1096); + setState(1105); _errHandler.sync(this); _alt = 1; do { @@ -8922,7 +8995,7 @@ public final PromqlCommandContext promqlCommand() throws RecognitionException { case 1: { { - setState(1095); + setState(1104); promqlQueryPart(); } } @@ -8930,7 +9003,7 @@ public final PromqlCommandContext promqlCommand() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(1098); + setState(1107); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,106,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -8975,12 +9048,12 @@ public T accept(ParseTreeVisitor visitor) { public final ValueNameContext valueName() throws RecognitionException { ValueNameContext _localctx = new ValueNameContext(_ctx, getState()); - enterRule(_localctx, 206, RULE_valueName); + enterRule(_localctx, 208, RULE_valueName); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1102); + setState(1111); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -9036,15 +9109,15 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlParamContext promqlParam() throws RecognitionException { PromqlParamContext _localctx = new PromqlParamContext(_ctx, getState()); - enterRule(_localctx, 208, RULE_promqlParam); + enterRule(_localctx, 210, RULE_promqlParam); try { enterOuterAlt(_localctx, 1); { - setState(1104); + setState(1113); ((PromqlParamContext)_localctx).name = promqlParamName(); - setState(1105); + setState(1114); match(ASSIGN); - setState(1106); + setState(1115); ((PromqlParamContext)_localctx).value = promqlParamValue(); } } @@ -9087,14 +9160,14 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlParamNameContext promqlParamName() throws RecognitionException { PromqlParamNameContext _localctx = new PromqlParamNameContext(_ctx, getState()); - enterRule(_localctx, 210, RULE_promqlParamName); + enterRule(_localctx, 212, RULE_promqlParamName); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1108); + setState(1117); _la = _input.LA(1); - if ( !(((((_la - 58)) & ~0x3f) == 0 && ((1L << (_la - 58)) & 1697645953286145L) != 0)) ) { + if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 1697645953286145L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9151,10 +9224,10 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlParamValueContext promqlParamValue() throws RecognitionException { PromqlParamValueContext _localctx = new PromqlParamValueContext(_ctx, getState()); - enterRule(_localctx, 212, RULE_promqlParamValue); + enterRule(_localctx, 214, RULE_promqlParamValue); try { int _alt; - setState(1120); + setState(1129); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -9162,23 +9235,23 @@ public final PromqlParamValueContext promqlParamValue() throws RecognitionExcept case UNQUOTED_SOURCE: enterOuterAlt(_localctx, 1); { - setState(1110); + setState(1119); promqlIndexPattern(); - setState(1115); + setState(1124); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,108,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(1111); + setState(1120); match(COMMA); - setState(1112); + setState(1121); promqlIndexPattern(); } } } - setState(1117); + setState(1126); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,108,_ctx); } @@ -9187,14 +9260,14 @@ public final PromqlParamValueContext promqlParamValue() throws RecognitionExcept case QUOTED_IDENTIFIER: enterOuterAlt(_localctx, 2); { - setState(1118); + setState(1127); match(QUOTED_IDENTIFIER); } break; case NAMED_OR_POSITIONAL_PARAM: enterOuterAlt(_localctx, 3); { - setState(1119); + setState(1128); match(NAMED_OR_POSITIONAL_PARAM); } break; @@ -9249,14 +9322,14 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlQueryContentContext promqlQueryContent() throws RecognitionException { PromqlQueryContentContext _localctx = new PromqlQueryContentContext(_ctx, getState()); - enterRule(_localctx, 214, RULE_promqlQueryContent); + enterRule(_localctx, 216, RULE_promqlQueryContent); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1122); + setState(1131); _la = _input.LA(1); - if ( !(((((_la - 58)) & ~0x3f) == 0 && ((1L << (_la - 58)) & 37726442972251553L) != 0) || ((((_la - 155)) & ~0x3f) == 0 && ((1L << (_la - 155)) & 7L) != 0)) ) { + if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 37726442972251553L) != 0) || ((((_la - 156)) & ~0x3f) == 0 && ((1L << (_la - 156)) & 7L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9315,11 +9388,11 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlQueryPartContext promqlQueryPart() throws RecognitionException { PromqlQueryPartContext _localctx = new PromqlQueryPartContext(_ctx, getState()); - enterRule(_localctx, 216, RULE_promqlQueryPart); + enterRule(_localctx, 218, RULE_promqlQueryPart); int _la; try { int _alt; - setState(1137); + setState(1146); _errHandler.sync(this); switch (_input.LA(1)) { case QUOTED_STRING: @@ -9336,7 +9409,7 @@ public final PromqlQueryPartContext promqlQueryPart() throws RecognitionExceptio case PROMQL_OTHER_QUERY_CONTENT: enterOuterAlt(_localctx, 1); { - setState(1125); + setState(1134); _errHandler.sync(this); _alt = 1; do { @@ -9344,7 +9417,7 @@ public final PromqlQueryPartContext promqlQueryPart() throws RecognitionExceptio case 1: { { - setState(1124); + setState(1133); promqlQueryContent(); } } @@ -9352,7 +9425,7 @@ public final PromqlQueryPartContext promqlQueryPart() throws RecognitionExceptio default: throw new NoViableAltException(this); } - setState(1127); + setState(1136); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,110,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -9361,23 +9434,23 @@ public final PromqlQueryPartContext promqlQueryPart() throws RecognitionExceptio case LP: enterOuterAlt(_localctx, 2); { - setState(1129); + setState(1138); match(LP); - setState(1133); + setState(1142); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 58)) & ~0x3f) == 0 && ((1L << (_la - 58)) & 37867180460606881L) != 0) || ((((_la - 155)) & ~0x3f) == 0 && ((1L << (_la - 155)) & 7L) != 0)) { + while (((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 37867180460606881L) != 0) || ((((_la - 156)) & ~0x3f) == 0 && ((1L << (_la - 156)) & 7L) != 0)) { { { - setState(1130); + setState(1139); promqlQueryPart(); } } - setState(1135); + setState(1144); _errHandler.sync(this); _la = _input.LA(1); } - setState(1136); + setState(1145); match(RP); } break; @@ -9434,37 +9507,37 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlIndexPatternContext promqlIndexPattern() throws RecognitionException { PromqlIndexPatternContext _localctx = new PromqlIndexPatternContext(_ctx, getState()); - enterRule(_localctx, 218, RULE_promqlIndexPattern); + enterRule(_localctx, 220, RULE_promqlIndexPattern); try { - setState(1148); + setState(1157); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,113,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(1139); + setState(1148); promqlClusterString(); - setState(1140); + setState(1149); match(COLON); - setState(1141); + setState(1150); promqlUnquotedIndexString(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(1143); + setState(1152); promqlUnquotedIndexString(); - setState(1144); + setState(1153); match(CAST_OP); - setState(1145); + setState(1154); promqlSelectorString(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(1147); + setState(1156); promqlIndexString(); } break; @@ -9507,12 +9580,12 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlClusterStringContext promqlClusterString() throws RecognitionException { PromqlClusterStringContext _localctx = new PromqlClusterStringContext(_ctx, getState()); - enterRule(_localctx, 220, RULE_promqlClusterString); + enterRule(_localctx, 222, RULE_promqlClusterString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1150); + setState(1159); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -9561,12 +9634,12 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlSelectorStringContext promqlSelectorString() throws RecognitionException { PromqlSelectorStringContext _localctx = new PromqlSelectorStringContext(_ctx, getState()); - enterRule(_localctx, 222, RULE_promqlSelectorString); + enterRule(_localctx, 224, RULE_promqlSelectorString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1152); + setState(1161); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -9615,12 +9688,12 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlUnquotedIndexStringContext promqlUnquotedIndexString() throws RecognitionException { PromqlUnquotedIndexStringContext _localctx = new PromqlUnquotedIndexStringContext(_ctx, getState()); - enterRule(_localctx, 224, RULE_promqlUnquotedIndexString); + enterRule(_localctx, 226, RULE_promqlUnquotedIndexString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1154); + setState(1163); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -9670,14 +9743,14 @@ public T accept(ParseTreeVisitor visitor) { public final PromqlIndexStringContext promqlIndexString() throws RecognitionException { PromqlIndexStringContext _localctx = new PromqlIndexStringContext(_ctx, getState()); - enterRule(_localctx, 226, RULE_promqlIndexString); + enterRule(_localctx, 228, RULE_promqlIndexString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(1156); + setState(1165); _la = _input.LA(1); - if ( !(((((_la - 58)) & ~0x3f) == 0 && ((1L << (_la - 58)) & 36591746972385281L) != 0)) ) { + if ( !(((((_la - 59)) & ~0x3f) == 0 && ((1L << (_la - 59)) & 36591746972385281L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -9714,13 +9787,13 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { return limitByGroupKey_sempred((LimitByGroupKeyContext)_localctx, predIndex); case 63: return forkSubQueryCommand_sempred((ForkSubQueryCommandContext)_localctx, predIndex); - case 81: + case 82: return booleanExpression_sempred((BooleanExpressionContext)_localctx, predIndex); - case 85: - return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); case 86: + return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); + case 87: return primaryExpression_sempred((PrimaryExpressionContext)_localctx, predIndex); - case 100: + case 101: return joinTarget_sempred((JoinTargetContext)_localctx, predIndex); } return true; @@ -9812,7 +9885,7 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0001\u00a8\u0487\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ + "\u0004\u0001\u00a9\u0490\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001"+ "\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004"+ "\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007"+ "\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b"+ @@ -9838,699 +9911,703 @@ private boolean joinTarget_sempred(JoinTargetContext _localctx, int predIndex) { "^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007"+ "c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007"+ "h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007"+ - "m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007q\u0001\u0000"+ - "\u0005\u0000\u00e6\b\u0000\n\u0000\f\u0000\u00e9\t\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0005\u0002\u00f7"+ - "\b\u0002\n\u0002\f\u0002\u00fa\t\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ - "\u0003\u0003\u0105\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0003\u0004\u0124\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ - "\b\u0001\b\u0005\b\u0131\b\b\n\b\f\b\u0134\t\b\u0001\t\u0001\t\u0001\t"+ - "\u0003\t\u0139\b\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ - "\r\u0001\r\u0005\r\u014a\b\r\n\r\f\r\u014d\t\r\u0001\r\u0003\r\u0150\b"+ - "\r\u0001\u000e\u0001\u000e\u0003\u000e\u0154\b\u000e\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0005\u000f\u015a\b\u000f\n\u000f\f\u000f"+ - "\u015d\t\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0003\u0010\u0164\b\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010"+ - "\u0169\b\u0010\u0001\u0010\u0003\u0010\u016c\b\u0010\u0001\u0011\u0001"+ - "\u0011\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001"+ - "\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0005\u0015\u017a"+ - "\b\u0015\n\u0015\f\u0015\u017d\t\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0017\u0001\u0017\u0003\u0017\u0184\b\u0017\u0001\u0017\u0001\u0017"+ - "\u0003\u0017\u0188\b\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018"+ - "\u018d\b\u0018\n\u0018\f\u0018\u0190\t\u0018\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0003\u0019\u0195\b\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0003"+ - "\u001a\u019a\b\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u01a3\b\u001a\u0001\u001b\u0001"+ - "\u001b\u0001\u001b\u0005\u001b\u01a8\b\u001b\n\u001b\f\u001b\u01ab\t\u001b"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u01b0\b\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ - "\u0003\u001c\u01b9\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0005\u001d"+ - "\u01be\b\u001d\n\u001d\f\u001d\u01c1\t\u001d\u0001\u001e\u0001\u001e\u0001"+ - "\u001e\u0005\u001e\u01c6\b\u001e\n\u001e\f\u001e\u01c9\t\u001e\u0001\u001f"+ - "\u0001\u001f\u0001 \u0001 \u0001 \u0003 \u01d0\b \u0001!\u0001!\u0003"+ - "!\u01d4\b!\u0001\"\u0001\"\u0003\"\u01d8\b\"\u0001#\u0001#\u0001#\u0003"+ - "#\u01dd\b#\u0001$\u0001$\u0003$\u01e1\b$\u0001%\u0001%\u0001%\u0003%\u01e6"+ - "\b%\u0001&\u0001&\u0001&\u0001&\u0001&\u0005&\u01ed\b&\n&\f&\u01f0\t&"+ - "\u0001\'\u0001\'\u0001\'\u0001\'\u0005\'\u01f6\b\'\n\'\f\'\u01f9\t\'\u0001"+ - "(\u0001(\u0003(\u01fd\b(\u0001(\u0001(\u0003(\u0201\b(\u0001)\u0001)\u0001"+ - ")\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0005+\u020d\b+\n+"+ - "\f+\u0210\t+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0003"+ - ",\u021a\b,\u0001-\u0001-\u0001-\u0001-\u0003-\u0220\b-\u0001.\u0001.\u0001"+ - ".\u0005.\u0225\b.\n.\f.\u0228\t.\u0001/\u0001/\u0001/\u0001/\u00010\u0001"+ - "0\u00030\u0230\b0\u00011\u00011\u00011\u00011\u00011\u00051\u0237\b1\n"+ - "1\f1\u023a\t1\u00012\u00012\u00012\u00013\u00013\u00013\u00014\u00014"+ - "\u00014\u00014\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u0003"+ - "6\u024d\b6\u00016\u00016\u00016\u00016\u00056\u0253\b6\n6\f6\u0256\t6"+ - "\u00036\u0258\b6\u00017\u00017\u00018\u00018\u00018\u00038\u025f\b8\u0001"+ - "8\u00018\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0005:\u0269\b:\n:"+ - "\f:\u026c\t:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0003;\u0275"+ - "\b;\u0001<\u0001<\u0001<\u0001=\u0004=\u027b\b=\u000b=\f=\u027c\u0001"+ - ">\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0005"+ - "?\u0289\b?\n?\f?\u028c\t?\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0003"+ - "A\u0294\bA\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ - "B\u0003B\u029f\bB\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001"+ - "C\u0003C\u02a9\bC\u0001C\u0001C\u0001C\u0001C\u0003C\u02af\bC\u0003C\u02b1"+ - "\bC\u0001D\u0001D\u0003D\u02b5\bD\u0001D\u0005D\u02b8\bD\nD\fD\u02bb\t"+ - "D\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ - "E\u0001E\u0003E\u02c8\bE\u0001F\u0001F\u0001F\u0005F\u02cd\bF\nF\fF\u02d0"+ - "\tF\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001"+ - "J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001"+ - "L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001"+ - "N\u0003N\u02f0\bN\u0001O\u0001O\u0003O\u02f4\bO\u0001O\u0001O\u0001O\u0001"+ - "O\u0001O\u0001O\u0001P\u0001P\u0003P\u02fe\bP\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001Q\u0001Q\u0001Q\u0003Q\u0307\bQ\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0005Q\u030e\bQ\nQ\fQ\u0311\tQ\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0003"+ - "Q\u0318\bQ\u0001Q\u0001Q\u0001Q\u0003Q\u031d\bQ\u0001Q\u0001Q\u0001Q\u0001"+ - "Q\u0001Q\u0001Q\u0005Q\u0325\bQ\nQ\fQ\u0328\tQ\u0001R\u0001R\u0003R\u032c"+ - "\bR\u0001R\u0001R\u0001R\u0001R\u0001R\u0003R\u0333\bR\u0001R\u0001R\u0001"+ - "R\u0001R\u0001R\u0003R\u033a\bR\u0001R\u0001R\u0001R\u0001R\u0001R\u0005"+ - "R\u0341\bR\nR\fR\u0344\tR\u0001R\u0001R\u0001R\u0001R\u0003R\u034a\bR"+ - "\u0001R\u0001R\u0001R\u0001R\u0001R\u0005R\u0351\bR\nR\fR\u0354\tR\u0001"+ - "R\u0001R\u0003R\u0358\bR\u0001S\u0001S\u0001S\u0003S\u035d\bS\u0001S\u0001"+ - "S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0003T\u0367\bT\u0001U\u0001"+ - "U\u0001U\u0001U\u0003U\u036d\bU\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ - "U\u0005U\u0375\bU\nU\fU\u0378\tU\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ - "V\u0001V\u0001V\u0003V\u0382\bV\u0001V\u0001V\u0001V\u0005V\u0387\bV\n"+ - "V\fV\u038a\tV\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0005W\u0392\b"+ - "W\nW\fW\u0395\tW\u0001W\u0001W\u0003W\u0399\bW\u0003W\u039b\bW\u0001W"+ - "\u0001W\u0001X\u0001X\u0001X\u0003X\u03a2\bX\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0005Y\u03a8\bY\nY\fY\u03ab\tY\u0003Y\u03ad\bY\u0001Y\u0001Y\u0001Z"+ - "\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0003[\u03b7\b[\u0001\\\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ - "\\\u0001\\\u0005\\\u03c6\b\\\n\\\f\\\u03c9\t\\\u0001\\\u0001\\\u0001\\"+ - "\u0001\\\u0001\\\u0001\\\u0005\\\u03d1\b\\\n\\\f\\\u03d4\t\\\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001\\\u0001\\\u0005\\\u03dc\b\\\n\\\f\\\u03df\t\\"+ - "\u0001\\\u0001\\\u0003\\\u03e3\b\\\u0001]\u0001]\u0001^\u0001^\u0003^"+ - "\u03e9\b^\u0001_\u0003_\u03ec\b_\u0001_\u0001_\u0001`\u0003`\u03f1\b`"+ - "\u0001`\u0001`\u0001a\u0001a\u0001b\u0001b\u0001c\u0001c\u0001c\u0001"+ - "c\u0001c\u0001d\u0001d\u0001d\u0003d\u0401\bd\u0001d\u0001d\u0001d\u0003"+ - "d\u0406\bd\u0001e\u0001e\u0001e\u0001e\u0005e\u040c\be\ne\fe\u040f\te"+ - "\u0001f\u0001f\u0005f\u0413\bf\nf\ff\u0416\tf\u0001f\u0001f\u0001f\u0003"+ - "f\u041b\bf\u0001f\u0001f\u0001f\u0001f\u0001f\u0005f\u0422\bf\nf\ff\u0425"+ - "\tf\u0001f\u0001f\u0001f\u0003f\u042a\bf\u0001f\u0001f\u0001f\u0005f\u042f"+ - "\bf\nf\ff\u0432\tf\u0001f\u0001f\u0001f\u0003f\u0437\bf\u0001f\u0001f"+ - "\u0004f\u043b\bf\u000bf\ff\u043c\u0001f\u0001f\u0001f\u0001f\u0005f\u0443"+ - "\bf\nf\ff\u0446\tf\u0001f\u0004f\u0449\bf\u000bf\ff\u044a\u0003f\u044d"+ - "\bf\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001j\u0001"+ - "j\u0001j\u0005j\u045a\bj\nj\fj\u045d\tj\u0001j\u0001j\u0003j\u0461\bj"+ - "\u0001k\u0001k\u0001l\u0004l\u0466\bl\u000bl\fl\u0467\u0001l\u0001l\u0005"+ - "l\u046c\bl\nl\fl\u046f\tl\u0001l\u0003l\u0472\bl\u0001m\u0001m\u0001m"+ - "\u0001m\u0001m\u0001m\u0001m\u0001m\u0001m\u0003m\u047d\bm\u0001n\u0001"+ - "n\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001q\u0000\u0005\u0004~"+ - "\u00a2\u00aa\u00acr\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014"+ - "\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfh"+ - "jlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092"+ - "\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa"+ - "\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2"+ - "\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da"+ - "\u00dc\u00de\u00e0\u00e2\u0000\u000e\u0002\u0000::qq\u0001\u0000kl\u0002"+ - "\u0000>>EE\u0002\u0000HHKK\u0002\u0000//::\u0001\u0000]^\u0001\u0000_"+ - "a\u0002\u0000GGTT\u0002\u0000VVX\\\u0002\u0000\u001d\u001d\u001f \u0003"+ - "\u0000::eekl\b\u0000::??ABDDeeklqq\u009b\u009d\u0002\u0000kkqq\u0003\u0000"+ - "::kkqq\u04be\u0000\u00e7\u0001\u0000\u0000\u0000\u0002\u00ed\u0001\u0000"+ - "\u0000\u0000\u0004\u00f0\u0001\u0000\u0000\u0000\u0006\u0104\u0001\u0000"+ - "\u0000\u0000\b\u0123\u0001\u0000\u0000\u0000\n\u0125\u0001\u0000\u0000"+ - "\u0000\f\u0128\u0001\u0000\u0000\u0000\u000e\u012a\u0001\u0000\u0000\u0000"+ - "\u0010\u012d\u0001\u0000\u0000\u0000\u0012\u0138\u0001\u0000\u0000\u0000"+ - "\u0014\u013c\u0001\u0000\u0000\u0000\u0016\u013f\u0001\u0000\u0000\u0000"+ - "\u0018\u0142\u0001\u0000\u0000\u0000\u001a\u0146\u0001\u0000\u0000\u0000"+ - "\u001c\u0153\u0001\u0000\u0000\u0000\u001e\u0155\u0001\u0000\u0000\u0000"+ - " \u016b\u0001\u0000\u0000\u0000\"\u016d\u0001\u0000\u0000\u0000$\u016f"+ - "\u0001\u0000\u0000\u0000&\u0171\u0001\u0000\u0000\u0000(\u0173\u0001\u0000"+ - "\u0000\u0000*\u0175\u0001\u0000\u0000\u0000,\u017e\u0001\u0000\u0000\u0000"+ - ".\u0181\u0001\u0000\u0000\u00000\u0189\u0001\u0000\u0000\u00002\u0191"+ - "\u0001\u0000\u0000\u00004\u01a2\u0001\u0000\u0000\u00006\u01a4\u0001\u0000"+ - "\u0000\u00008\u01b8\u0001\u0000\u0000\u0000:\u01ba\u0001\u0000\u0000\u0000"+ - "<\u01c2\u0001\u0000\u0000\u0000>\u01ca\u0001\u0000\u0000\u0000@\u01cf"+ - "\u0001\u0000\u0000\u0000B\u01d3\u0001\u0000\u0000\u0000D\u01d7\u0001\u0000"+ - "\u0000\u0000F\u01dc\u0001\u0000\u0000\u0000H\u01e0\u0001\u0000\u0000\u0000"+ - "J\u01e2\u0001\u0000\u0000\u0000L\u01e7\u0001\u0000\u0000\u0000N\u01f1"+ - "\u0001\u0000\u0000\u0000P\u01fa\u0001\u0000\u0000\u0000R\u0202\u0001\u0000"+ - "\u0000\u0000T\u0205\u0001\u0000\u0000\u0000V\u0208\u0001\u0000\u0000\u0000"+ - "X\u0219\u0001\u0000\u0000\u0000Z\u021b\u0001\u0000\u0000\u0000\\\u0221"+ - "\u0001\u0000\u0000\u0000^\u0229\u0001\u0000\u0000\u0000`\u022f\u0001\u0000"+ - "\u0000\u0000b\u0231\u0001\u0000\u0000\u0000d\u023b\u0001\u0000\u0000\u0000"+ - "f\u023e\u0001\u0000\u0000\u0000h\u0241\u0001\u0000\u0000\u0000j\u0245"+ - "\u0001\u0000\u0000\u0000l\u0248\u0001\u0000\u0000\u0000n\u0259\u0001\u0000"+ - "\u0000\u0000p\u025e\u0001\u0000\u0000\u0000r\u0262\u0001\u0000\u0000\u0000"+ - "t\u0265\u0001\u0000\u0000\u0000v\u0274\u0001\u0000\u0000\u0000x\u0276"+ - "\u0001\u0000\u0000\u0000z\u027a\u0001\u0000\u0000\u0000|\u027e\u0001\u0000"+ - "\u0000\u0000~\u0282\u0001\u0000\u0000\u0000\u0080\u028d\u0001\u0000\u0000"+ - "\u0000\u0082\u028f\u0001\u0000\u0000\u0000\u0084\u029a\u0001\u0000\u0000"+ - "\u0000\u0086\u02b0\u0001\u0000\u0000\u0000\u0088\u02b2\u0001\u0000\u0000"+ - "\u0000\u008a\u02c7\u0001\u0000\u0000\u0000\u008c\u02c9\u0001\u0000\u0000"+ - "\u0000\u008e\u02d1\u0001\u0000\u0000\u0000\u0090\u02d3\u0001\u0000\u0000"+ - "\u0000\u0092\u02d5\u0001\u0000\u0000\u0000\u0094\u02da\u0001\u0000\u0000"+ - "\u0000\u0096\u02dd\u0001\u0000\u0000\u0000\u0098\u02e2\u0001\u0000\u0000"+ - "\u0000\u009a\u02e7\u0001\u0000\u0000\u0000\u009c\u02eb\u0001\u0000\u0000"+ - "\u0000\u009e\u02f1\u0001\u0000\u0000\u0000\u00a0\u02fd\u0001\u0000\u0000"+ - "\u0000\u00a2\u031c\u0001\u0000\u0000\u0000\u00a4\u0357\u0001\u0000\u0000"+ - "\u0000\u00a6\u0359\u0001\u0000\u0000\u0000\u00a8\u0366\u0001\u0000\u0000"+ - "\u0000\u00aa\u036c\u0001\u0000\u0000\u0000\u00ac\u0381\u0001\u0000\u0000"+ - "\u0000\u00ae\u038b\u0001\u0000\u0000\u0000\u00b0\u03a1\u0001\u0000\u0000"+ - "\u0000\u00b2\u03a3\u0001\u0000\u0000\u0000\u00b4\u03b0\u0001\u0000\u0000"+ - "\u0000\u00b6\u03b6\u0001\u0000\u0000\u0000\u00b8\u03e2\u0001\u0000\u0000"+ - "\u0000\u00ba\u03e4\u0001\u0000\u0000\u0000\u00bc\u03e8\u0001\u0000\u0000"+ - "\u0000\u00be\u03eb\u0001\u0000\u0000\u0000\u00c0\u03f0\u0001\u0000\u0000"+ - "\u0000\u00c2\u03f4\u0001\u0000\u0000\u0000\u00c4\u03f6\u0001\u0000\u0000"+ - "\u0000\u00c6\u03f8\u0001\u0000\u0000\u0000\u00c8\u0405\u0001\u0000\u0000"+ - "\u0000\u00ca\u0407\u0001\u0000\u0000\u0000\u00cc\u044c\u0001\u0000\u0000"+ - "\u0000\u00ce\u044e\u0001\u0000\u0000\u0000\u00d0\u0450\u0001\u0000\u0000"+ - "\u0000\u00d2\u0454\u0001\u0000\u0000\u0000\u00d4\u0460\u0001\u0000\u0000"+ - "\u0000\u00d6\u0462\u0001\u0000\u0000\u0000\u00d8\u0471\u0001\u0000\u0000"+ - "\u0000\u00da\u047c\u0001\u0000\u0000\u0000\u00dc\u047e\u0001\u0000\u0000"+ - "\u0000\u00de\u0480\u0001\u0000\u0000\u0000\u00e0\u0482\u0001\u0000\u0000"+ - "\u0000\u00e2\u0484\u0001\u0000\u0000\u0000\u00e4\u00e6\u0003\u009aM\u0000"+ - "\u00e5\u00e4\u0001\u0000\u0000\u0000\u00e6\u00e9\u0001\u0000\u0000\u0000"+ - "\u00e7\u00e5\u0001\u0000\u0000\u0000\u00e7\u00e8\u0001\u0000\u0000\u0000"+ - "\u00e8\u00ea\u0001\u0000\u0000\u0000\u00e9\u00e7\u0001\u0000\u0000\u0000"+ - "\u00ea\u00eb\u0003\u0002\u0001\u0000\u00eb\u00ec\u0005\u0000\u0000\u0001"+ - "\u00ec\u0001\u0001\u0000\u0000\u0000\u00ed\u00ee\u0003\u0004\u0002\u0000"+ - "\u00ee\u00ef\u0005\u0000\u0000\u0001\u00ef\u0003\u0001\u0000\u0000\u0000"+ - "\u00f0\u00f1\u0006\u0002\uffff\uffff\u0000\u00f1\u00f2\u0003\u0006\u0003"+ - "\u0000\u00f2\u00f8\u0001\u0000\u0000\u0000\u00f3\u00f4\n\u0001\u0000\u0000"+ - "\u00f4\u00f5\u00059\u0000\u0000\u00f5\u00f7\u0003\b\u0004\u0000\u00f6"+ - "\u00f3\u0001\u0000\u0000\u0000\u00f7\u00fa\u0001\u0000\u0000\u0000\u00f8"+ - "\u00f6\u0001\u0000\u0000\u0000\u00f8\u00f9\u0001\u0000\u0000\u0000\u00f9"+ - "\u0005\u0001\u0000\u0000\u0000\u00fa\u00f8\u0001\u0000\u0000\u0000\u00fb"+ - "\u0105\u0003\u0014\n\u0000\u00fc\u0105\u0003\u000e\u0007\u0000\u00fd\u0105"+ - "\u0003j5\u0000\u00fe\u0105\u0003\u0016\u000b\u0000\u00ff\u0105\u0003\u00cc"+ - "f\u0000\u0100\u0101\u0004\u0003\u0001\u0000\u0101\u0105\u0003f3\u0000"+ - "\u0102\u0103\u0004\u0003\u0002\u0000\u0103\u0105\u0003\u0018\f\u0000\u0104"+ - "\u00fb\u0001\u0000\u0000\u0000\u0104\u00fc\u0001\u0000\u0000\u0000\u0104"+ - "\u00fd\u0001\u0000\u0000\u0000\u0104\u00fe\u0001\u0000\u0000\u0000\u0104"+ - "\u00ff\u0001\u0000\u0000\u0000\u0104\u0100\u0001\u0000\u0000\u0000\u0104"+ - "\u0102\u0001\u0000\u0000\u0000\u0105\u0007\u0001\u0000\u0000\u0000\u0106"+ - "\u0124\u0003,\u0016\u0000\u0107\u0124\u0003\n\u0005\u0000\u0108\u0124"+ - "\u0003R)\u0000\u0109\u0124\u0003J%\u0000\u010a\u0124\u0003.\u0017\u0000"+ - "\u010b\u0124\u0003N\'\u0000\u010c\u0124\u0003T*\u0000\u010d\u0124\u0003"+ - "V+\u0000\u010e\u0124\u0003Z-\u0000\u010f\u0124\u0003b1\u0000\u0110\u0124"+ - "\u0003l6\u0000\u0111\u0124\u0003d2\u0000\u0112\u0124\u0003\u00c6c\u0000"+ - "\u0113\u0124\u0003t:\u0000\u0114\u0124\u0003\u0084B\u0000\u0115\u0124"+ - "\u0003r9\u0000\u0116\u0124\u0003x<\u0000\u0117\u0124\u0003\u0082A\u0000"+ - "\u0118\u0124\u0003\u0086C\u0000\u0119\u0124\u0003\u0088D\u0000\u011a\u0124"+ - "\u0003\u0096K\u0000\u011b\u0124\u0003\u008eG\u0000\u011c\u0124\u0003\u0098"+ - "L\u0000\u011d\u0124\u0003\u0090H\u0000\u011e\u0124\u0003\u009eO\u0000"+ - "\u011f\u0120\u0004\u0004\u0003\u0000\u0120\u0124\u0003\u0092I\u0000\u0121"+ - "\u0122\u0004\u0004\u0004\u0000\u0122\u0124\u0003\u0094J\u0000\u0123\u0106"+ - "\u0001\u0000\u0000\u0000\u0123\u0107\u0001\u0000\u0000\u0000\u0123\u0108"+ - "\u0001\u0000\u0000\u0000\u0123\u0109\u0001\u0000\u0000\u0000\u0123\u010a"+ - "\u0001\u0000\u0000\u0000\u0123\u010b\u0001\u0000\u0000\u0000\u0123\u010c"+ - "\u0001\u0000\u0000\u0000\u0123\u010d\u0001\u0000\u0000\u0000\u0123\u010e"+ - "\u0001\u0000\u0000\u0000\u0123\u010f\u0001\u0000\u0000\u0000\u0123\u0110"+ - "\u0001\u0000\u0000\u0000\u0123\u0111\u0001\u0000\u0000\u0000\u0123\u0112"+ - "\u0001\u0000\u0000\u0000\u0123\u0113\u0001\u0000\u0000\u0000\u0123\u0114"+ - "\u0001\u0000\u0000\u0000\u0123\u0115\u0001\u0000\u0000\u0000\u0123\u0116"+ - "\u0001\u0000\u0000\u0000\u0123\u0117\u0001\u0000\u0000\u0000\u0123\u0118"+ - "\u0001\u0000\u0000\u0000\u0123\u0119\u0001\u0000\u0000\u0000\u0123\u011a"+ - "\u0001\u0000\u0000\u0000\u0123\u011b\u0001\u0000\u0000\u0000\u0123\u011c"+ - "\u0001\u0000\u0000\u0000\u0123\u011d\u0001\u0000\u0000\u0000\u0123\u011e"+ - "\u0001\u0000\u0000\u0000\u0123\u011f\u0001\u0000\u0000\u0000\u0123\u0121"+ - "\u0001\u0000\u0000\u0000\u0124\t\u0001\u0000\u0000\u0000\u0125\u0126\u0005"+ - "\u0011\u0000\u0000\u0126\u0127\u0003\u00a2Q\u0000\u0127\u000b\u0001\u0000"+ - "\u0000\u0000\u0128\u0129\u0003>\u001f\u0000\u0129\r\u0001\u0000\u0000"+ - "\u0000\u012a\u012b\u0005\r\u0000\u0000\u012b\u012c\u0003\u0010\b\u0000"+ - "\u012c\u000f\u0001\u0000\u0000\u0000\u012d\u0132\u0003\u0012\t\u0000\u012e"+ - "\u012f\u0005D\u0000\u0000\u012f\u0131\u0003\u0012\t\u0000\u0130\u012e"+ - "\u0001\u0000\u0000\u0000\u0131\u0134\u0001\u0000\u0000\u0000\u0132\u0130"+ - "\u0001\u0000\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133\u0011"+ - "\u0001\u0000\u0000\u0000\u0134\u0132\u0001\u0000\u0000\u0000\u0135\u0136"+ - "\u00034\u001a\u0000\u0136\u0137\u0005?\u0000\u0000\u0137\u0139\u0001\u0000"+ - "\u0000\u0000\u0138\u0135\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000"+ - "\u0000\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a\u013b\u0003\u00a2"+ - "Q\u0000\u013b\u0013\u0001\u0000\u0000\u0000\u013c\u013d\u0005\u0016\u0000"+ - "\u0000\u013d\u013e\u0003\u001a\r\u0000\u013e\u0015\u0001\u0000\u0000\u0000"+ - "\u013f\u0140\u0005\u0017\u0000\u0000\u0140\u0141\u0003\u001a\r\u0000\u0141"+ - "\u0017\u0001\u0000\u0000\u0000\u0142\u0143\u0005\u0018\u0000\u0000\u0143"+ - "\u0144\u0003H$\u0000\u0144\u0145\u0003`0\u0000\u0145\u0019\u0001\u0000"+ - "\u0000\u0000\u0146\u014b\u0003\u001c\u000e\u0000\u0147\u0148\u0005D\u0000"+ - "\u0000\u0148\u014a\u0003\u001c\u000e\u0000\u0149\u0147\u0001\u0000\u0000"+ - "\u0000\u014a\u014d\u0001\u0000\u0000\u0000\u014b\u0149\u0001\u0000\u0000"+ - "\u0000\u014b\u014c\u0001\u0000\u0000\u0000\u014c\u014f\u0001\u0000\u0000"+ - "\u0000\u014d\u014b\u0001\u0000\u0000\u0000\u014e\u0150\u0003*\u0015\u0000"+ - "\u014f\u014e\u0001\u0000\u0000\u0000\u014f\u0150\u0001\u0000\u0000\u0000"+ - "\u0150\u001b\u0001\u0000\u0000\u0000\u0151\u0154\u0003 \u0010\u0000\u0152"+ - "\u0154\u0003\u001e\u000f\u0000\u0153\u0151\u0001\u0000\u0000\u0000\u0153"+ - "\u0152\u0001\u0000\u0000\u0000\u0154\u001d\u0001\u0000\u0000\u0000\u0155"+ - "\u0156\u0005i\u0000\u0000\u0156\u015b\u0003\u0014\n\u0000\u0157\u0158"+ - "\u00059\u0000\u0000\u0158\u015a\u0003\b\u0004\u0000\u0159\u0157\u0001"+ - "\u0000\u0000\u0000\u015a\u015d\u0001\u0000\u0000\u0000\u015b\u0159\u0001"+ - "\u0000\u0000\u0000\u015b\u015c\u0001\u0000\u0000\u0000\u015c\u015e\u0001"+ - "\u0000\u0000\u0000\u015d\u015b\u0001\u0000\u0000\u0000\u015e\u015f\u0005"+ - "j\u0000\u0000\u015f\u001f\u0001\u0000\u0000\u0000\u0160\u0161\u0003\""+ - "\u0011\u0000\u0161\u0162\u0005B\u0000\u0000\u0162\u0164\u0001\u0000\u0000"+ - "\u0000\u0163\u0160\u0001\u0000\u0000\u0000\u0163\u0164\u0001\u0000\u0000"+ - "\u0000\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u0168\u0003&\u0013\u0000"+ - "\u0166\u0167\u0005A\u0000\u0000\u0167\u0169\u0003$\u0012\u0000\u0168\u0166"+ - "\u0001\u0000\u0000\u0000\u0168\u0169\u0001\u0000\u0000\u0000\u0169\u016c"+ - "\u0001\u0000\u0000\u0000\u016a\u016c\u0003(\u0014\u0000\u016b\u0163\u0001"+ - "\u0000\u0000\u0000\u016b\u016a\u0001\u0000\u0000\u0000\u016c!\u0001\u0000"+ - "\u0000\u0000\u016d\u016e\u0005q\u0000\u0000\u016e#\u0001\u0000\u0000\u0000"+ - "\u016f\u0170\u0005q\u0000\u0000\u0170%\u0001\u0000\u0000\u0000\u0171\u0172"+ - "\u0005q\u0000\u0000\u0172\'\u0001\u0000\u0000\u0000\u0173\u0174\u0007"+ - "\u0000\u0000\u0000\u0174)\u0001\u0000\u0000\u0000\u0175\u0176\u0005p\u0000"+ - "\u0000\u0176\u017b\u0005q\u0000\u0000\u0177\u0178\u0005D\u0000\u0000\u0178"+ - "\u017a\u0005q\u0000\u0000\u0179\u0177\u0001\u0000\u0000\u0000\u017a\u017d"+ - "\u0001\u0000\u0000\u0000\u017b\u0179\u0001\u0000\u0000\u0000\u017b\u017c"+ - "\u0001\u0000\u0000\u0000\u017c+\u0001\u0000\u0000\u0000\u017d\u017b\u0001"+ - "\u0000\u0000\u0000\u017e\u017f\u0005\t\u0000\u0000\u017f\u0180\u0003\u0010"+ - "\b\u0000\u0180-\u0001\u0000\u0000\u0000\u0181\u0183\u0005\u0010\u0000"+ - "\u0000\u0182\u0184\u00030\u0018\u0000\u0183\u0182\u0001\u0000\u0000\u0000"+ - "\u0183\u0184\u0001\u0000\u0000\u0000\u0184\u0187\u0001\u0000\u0000\u0000"+ - "\u0185\u0186\u0005@\u0000\u0000\u0186\u0188\u0003\u0010\b\u0000\u0187"+ - "\u0185\u0001\u0000\u0000\u0000\u0187\u0188\u0001\u0000\u0000\u0000\u0188"+ - "/\u0001\u0000\u0000\u0000\u0189\u018e\u00032\u0019\u0000\u018a\u018b\u0005"+ - "D\u0000\u0000\u018b\u018d\u00032\u0019\u0000\u018c\u018a\u0001\u0000\u0000"+ - "\u0000\u018d\u0190\u0001\u0000\u0000\u0000\u018e\u018c\u0001\u0000\u0000"+ - "\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f1\u0001\u0000\u0000\u0000"+ - "\u0190\u018e\u0001\u0000\u0000\u0000\u0191\u0194\u0003\u0012\t\u0000\u0192"+ - "\u0193\u0005\u0011\u0000\u0000\u0193\u0195\u0003\u00a2Q\u0000\u0194\u0192"+ - "\u0001\u0000\u0000\u0000\u0194\u0195\u0001\u0000\u0000\u0000\u01953\u0001"+ - "\u0000\u0000\u0000\u0196\u0197\u0004\u001a\u0005\u0000\u0197\u0199\u0005"+ - "g\u0000\u0000\u0198\u019a\u0005k\u0000\u0000\u0199\u0198\u0001\u0000\u0000"+ - "\u0000\u0199\u019a\u0001\u0000\u0000\u0000\u019a\u019b\u0001\u0000\u0000"+ - "\u0000\u019b\u019c\u0005h\u0000\u0000\u019c\u019d\u0005F\u0000\u0000\u019d"+ - "\u019e\u0005g\u0000\u0000\u019e\u019f\u00036\u001b\u0000\u019f\u01a0\u0005"+ - "h\u0000\u0000\u01a0\u01a3\u0001\u0000\u0000\u0000\u01a1\u01a3\u00036\u001b"+ - "\u0000\u01a2\u0196\u0001\u0000\u0000\u0000\u01a2\u01a1\u0001\u0000\u0000"+ - "\u0000\u01a35\u0001\u0000\u0000\u0000\u01a4\u01a9\u0003F#\u0000\u01a5"+ - "\u01a6\u0005F\u0000\u0000\u01a6\u01a8\u0003F#\u0000\u01a7\u01a5\u0001"+ - "\u0000\u0000\u0000\u01a8\u01ab\u0001\u0000\u0000\u0000\u01a9\u01a7\u0001"+ - "\u0000\u0000\u0000\u01a9\u01aa\u0001\u0000\u0000\u0000\u01aa7\u0001\u0000"+ - "\u0000\u0000\u01ab\u01a9\u0001\u0000\u0000\u0000\u01ac\u01ad\u0004\u001c"+ - "\u0006\u0000\u01ad\u01af\u0005g\u0000\u0000\u01ae\u01b0\u0005\u0094\u0000"+ - "\u0000\u01af\u01ae\u0001\u0000\u0000\u0000\u01af\u01b0\u0001\u0000\u0000"+ - "\u0000\u01b0\u01b1\u0001\u0000\u0000\u0000\u01b1\u01b2\u0005h\u0000\u0000"+ - "\u01b2\u01b3\u0005F\u0000\u0000\u01b3\u01b4\u0005g\u0000\u0000\u01b4\u01b5"+ - "\u0003:\u001d\u0000\u01b5\u01b6\u0005h\u0000\u0000\u01b6\u01b9\u0001\u0000"+ - "\u0000\u0000\u01b7\u01b9\u0003:\u001d\u0000\u01b8\u01ac\u0001\u0000\u0000"+ - "\u0000\u01b8\u01b7\u0001\u0000\u0000\u0000\u01b99\u0001\u0000\u0000\u0000"+ - "\u01ba\u01bf\u0003@ \u0000\u01bb\u01bc\u0005F\u0000\u0000\u01bc\u01be"+ - "\u0003@ \u0000\u01bd\u01bb\u0001\u0000\u0000\u0000\u01be\u01c1\u0001\u0000"+ - "\u0000\u0000\u01bf\u01bd\u0001\u0000\u0000\u0000\u01bf\u01c0\u0001\u0000"+ - "\u0000\u0000\u01c0;\u0001\u0000\u0000\u0000\u01c1\u01bf\u0001\u0000\u0000"+ - "\u0000\u01c2\u01c7\u00038\u001c\u0000\u01c3\u01c4\u0005D\u0000\u0000\u01c4"+ - "\u01c6\u00038\u001c\u0000\u01c5\u01c3\u0001\u0000\u0000\u0000\u01c6\u01c9"+ - "\u0001\u0000\u0000\u0000\u01c7\u01c5\u0001\u0000\u0000\u0000\u01c7\u01c8"+ - "\u0001\u0000\u0000\u0000\u01c8=\u0001\u0000\u0000\u0000\u01c9\u01c7\u0001"+ - "\u0000\u0000\u0000\u01ca\u01cb\u0007\u0001\u0000\u0000\u01cb?\u0001\u0000"+ - "\u0000\u0000\u01cc\u01d0\u0005\u0094\u0000\u0000\u01cd\u01d0\u0003B!\u0000"+ - "\u01ce\u01d0\u0003D\"\u0000\u01cf\u01cc\u0001\u0000\u0000\u0000\u01cf"+ - "\u01cd\u0001\u0000\u0000\u0000\u01cf\u01ce\u0001\u0000\u0000\u0000\u01d0"+ - "A\u0001\u0000\u0000\u0000\u01d1\u01d4\u0005R\u0000\u0000\u01d2\u01d4\u0005"+ - "e\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d2\u0001\u0000"+ - "\u0000\u0000\u01d4C\u0001\u0000\u0000\u0000\u01d5\u01d8\u0005d\u0000\u0000"+ - "\u01d6\u01d8\u0005f\u0000\u0000\u01d7\u01d5\u0001\u0000\u0000\u0000\u01d7"+ - "\u01d6\u0001\u0000\u0000\u0000\u01d8E\u0001\u0000\u0000\u0000\u01d9\u01dd"+ - "\u0003>\u001f\u0000\u01da\u01dd\u0003B!\u0000\u01db\u01dd\u0003D\"\u0000"+ - "\u01dc\u01d9\u0001\u0000\u0000\u0000\u01dc\u01da\u0001\u0000\u0000\u0000"+ - "\u01dc\u01db\u0001\u0000\u0000\u0000\u01ddG\u0001\u0000\u0000\u0000\u01de"+ - "\u01e1\u0003\u00c2a\u0000\u01df\u01e1\u0003B!\u0000\u01e0\u01de\u0001"+ - "\u0000\u0000\u0000\u01e0\u01df\u0001\u0000\u0000\u0000\u01e1I\u0001\u0000"+ - "\u0000\u0000\u01e2\u01e3\u0005\u000b\u0000\u0000\u01e3\u01e5\u0003\u00b8"+ - "\\\u0000\u01e4\u01e6\u0003L&\u0000\u01e5\u01e4\u0001\u0000\u0000\u0000"+ - "\u01e5\u01e6\u0001\u0000\u0000\u0000\u01e6K\u0001\u0000\u0000\u0000\u01e7"+ - "\u01e8\u0004&\u0007\u0000\u01e8\u01e9\u0005@\u0000\u0000\u01e9\u01ee\u0003"+ - "\u00a2Q\u0000\u01ea\u01eb\u0005D\u0000\u0000\u01eb\u01ed\u0003\u00a2Q"+ - "\u0000\u01ec\u01ea\u0001\u0000\u0000\u0000\u01ed\u01f0\u0001\u0000\u0000"+ - "\u0000\u01ee\u01ec\u0001\u0000\u0000\u0000\u01ee\u01ef\u0001\u0000\u0000"+ - "\u0000\u01efM\u0001\u0000\u0000\u0000\u01f0\u01ee\u0001\u0000\u0000\u0000"+ - "\u01f1\u01f2\u0005\u000f\u0000\u0000\u01f2\u01f7\u0003P(\u0000\u01f3\u01f4"+ - "\u0005D\u0000\u0000\u01f4\u01f6\u0003P(\u0000\u01f5\u01f3\u0001\u0000"+ - "\u0000\u0000\u01f6\u01f9\u0001\u0000\u0000\u0000\u01f7\u01f5\u0001\u0000"+ - "\u0000\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8O\u0001\u0000\u0000"+ - "\u0000\u01f9\u01f7\u0001\u0000\u0000\u0000\u01fa\u01fc\u0003\u00a2Q\u0000"+ - "\u01fb\u01fd\u0007\u0002\u0000\u0000\u01fc\u01fb\u0001\u0000\u0000\u0000"+ - "\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd\u0200\u0001\u0000\u0000\u0000"+ - "\u01fe\u01ff\u0005O\u0000\u0000\u01ff\u0201\u0007\u0003\u0000\u0000\u0200"+ - "\u01fe\u0001\u0000\u0000\u0000\u0200\u0201\u0001\u0000\u0000\u0000\u0201"+ - "Q\u0001\u0000\u0000\u0000\u0202\u0203\u0005%\u0000\u0000\u0203\u0204\u0003"+ - "<\u001e\u0000\u0204S\u0001\u0000\u0000\u0000\u0205\u0206\u0005$\u0000"+ - "\u0000\u0206\u0207\u0003<\u001e\u0000\u0207U\u0001\u0000\u0000\u0000\u0208"+ - "\u0209\u0005(\u0000\u0000\u0209\u020e\u0003X,\u0000\u020a\u020b\u0005"+ - "D\u0000\u0000\u020b\u020d\u0003X,\u0000\u020c\u020a\u0001\u0000\u0000"+ - "\u0000\u020d\u0210\u0001\u0000\u0000\u0000\u020e\u020c\u0001\u0000\u0000"+ - "\u0000\u020e\u020f\u0001\u0000\u0000\u0000\u020fW\u0001\u0000\u0000\u0000"+ - "\u0210\u020e\u0001\u0000\u0000\u0000\u0211\u0212\u00038\u001c\u0000\u0212"+ - "\u0213\u0005\u009e\u0000\u0000\u0213\u0214\u00038\u001c\u0000\u0214\u021a"+ - "\u0001\u0000\u0000\u0000\u0215\u0216\u00038\u001c\u0000\u0216\u0217\u0005"+ - "?\u0000\u0000\u0217\u0218\u00038\u001c\u0000\u0218\u021a\u0001\u0000\u0000"+ - "\u0000\u0219\u0211\u0001\u0000\u0000\u0000\u0219\u0215\u0001\u0000\u0000"+ - "\u0000\u021aY\u0001\u0000\u0000\u0000\u021b\u021c\u0005\b\u0000\u0000"+ - "\u021c\u021d\u0003\u00acV\u0000\u021d\u021f\u0003\u00c2a\u0000\u021e\u0220"+ - "\u0003\\.\u0000\u021f\u021e\u0001\u0000\u0000\u0000\u021f\u0220\u0001"+ - "\u0000\u0000\u0000\u0220[\u0001\u0000\u0000\u0000\u0221\u0226\u0003^/"+ - "\u0000\u0222\u0223\u0005D\u0000\u0000\u0223\u0225\u0003^/\u0000\u0224"+ - "\u0222\u0001\u0000\u0000\u0000\u0225\u0228\u0001\u0000\u0000\u0000\u0226"+ - "\u0224\u0001\u0000\u0000\u0000\u0226\u0227\u0001\u0000\u0000\u0000\u0227"+ - "]\u0001\u0000\u0000\u0000\u0228\u0226\u0001\u0000\u0000\u0000\u0229\u022a"+ - "\u0003>\u001f\u0000\u022a\u022b\u0005?\u0000\u0000\u022b\u022c\u0003\u00b8"+ - "\\\u0000\u022c_\u0001\u0000\u0000\u0000\u022d\u022e\u0005U\u0000\u0000"+ - "\u022e\u0230\u0003\u00b2Y\u0000\u022f\u022d\u0001\u0000\u0000\u0000\u022f"+ - "\u0230\u0001\u0000\u0000\u0000\u0230a\u0001\u0000\u0000\u0000\u0231\u0232"+ - "\u0005\n\u0000\u0000\u0232\u0233\u0003\u00acV\u0000\u0233\u0238\u0003"+ - "\u00c2a\u0000\u0234\u0235\u0005D\u0000\u0000\u0235\u0237\u0003\u00c2a"+ - "\u0000\u0236\u0234\u0001\u0000\u0000\u0000\u0237\u023a\u0001\u0000\u0000"+ - "\u0000\u0238\u0236\u0001\u0000\u0000\u0000\u0238\u0239\u0001\u0000\u0000"+ - "\u0000\u0239c\u0001\u0000\u0000\u0000\u023a\u0238\u0001\u0000\u0000\u0000"+ - "\u023b\u023c\u0005#\u0000\u0000\u023c\u023d\u00034\u001a\u0000\u023de"+ - "\u0001\u0000\u0000\u0000\u023e\u023f\u0005\u0006\u0000\u0000\u023f\u0240"+ - "\u0003h4\u0000\u0240g\u0001\u0000\u0000\u0000\u0241\u0242\u0005i\u0000"+ - "\u0000\u0242\u0243\u0003\u0004\u0002\u0000\u0243\u0244\u0005j\u0000\u0000"+ - "\u0244i\u0001\u0000\u0000\u0000\u0245\u0246\u0005*\u0000\u0000\u0246\u0247"+ - "\u0005\u00a5\u0000\u0000\u0247k\u0001\u0000\u0000\u0000\u0248\u0249\u0005"+ - "\u0005\u0000\u0000\u0249\u024c\u0003n7\u0000\u024a\u024b\u0005P\u0000"+ - "\u0000\u024b\u024d\u00038\u001c\u0000\u024c\u024a\u0001\u0000\u0000\u0000"+ - "\u024c\u024d\u0001\u0000\u0000\u0000\u024d\u0257\u0001\u0000\u0000\u0000"+ - "\u024e\u024f\u0005U\u0000\u0000\u024f\u0254\u0003p8\u0000\u0250\u0251"+ - "\u0005D\u0000\u0000\u0251\u0253\u0003p8\u0000\u0252\u0250\u0001\u0000"+ - "\u0000\u0000\u0253\u0256\u0001\u0000\u0000\u0000\u0254\u0252\u0001\u0000"+ - "\u0000\u0000\u0254\u0255\u0001\u0000\u0000\u0000\u0255\u0258\u0001\u0000"+ - "\u0000\u0000\u0256\u0254\u0001\u0000\u0000\u0000\u0257\u024e\u0001\u0000"+ - "\u0000\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258m\u0001\u0000\u0000"+ - "\u0000\u0259\u025a\u0007\u0004\u0000\u0000\u025ao\u0001\u0000\u0000\u0000"+ - "\u025b\u025c\u00038\u001c\u0000\u025c\u025d\u0005?\u0000\u0000\u025d\u025f"+ - "\u0001\u0000\u0000\u0000\u025e\u025b\u0001\u0000\u0000\u0000\u025e\u025f"+ - "\u0001\u0000\u0000\u0000\u025f\u0260\u0001\u0000\u0000\u0000\u0260\u0261"+ - "\u00038\u001c\u0000\u0261q\u0001\u0000\u0000\u0000\u0262\u0263\u0005\u000e"+ - "\u0000\u0000\u0263\u0264\u0003\u00b8\\\u0000\u0264s\u0001\u0000\u0000"+ - "\u0000\u0265\u0266\u0005\u0004\u0000\u0000\u0266\u026a\u00034\u001a\u0000"+ - "\u0267\u0269\u0003v;\u0000\u0268\u0267\u0001\u0000\u0000\u0000\u0269\u026c"+ - "\u0001\u0000\u0000\u0000\u026a\u0268\u0001\u0000\u0000\u0000\u026a\u026b"+ - "\u0001\u0000\u0000\u0000\u026bu\u0001\u0000\u0000\u0000\u026c\u026a\u0001"+ - "\u0000\u0000\u0000\u026d\u026e\u0005P\u0000\u0000\u026e\u0275\u00034\u001a"+ - "\u0000\u026f\u0270\u0005\u009e\u0000\u0000\u0270\u0271\u00034\u001a\u0000"+ - "\u0271\u0272\u0005D\u0000\u0000\u0272\u0273\u00034\u001a\u0000\u0273\u0275"+ - "\u0001\u0000\u0000\u0000\u0274\u026d\u0001\u0000\u0000\u0000\u0274\u026f"+ - "\u0001\u0000\u0000\u0000\u0275w\u0001\u0000\u0000\u0000\u0276\u0277\u0005"+ - "\u0019\u0000\u0000\u0277\u0278\u0003z=\u0000\u0278y\u0001\u0000\u0000"+ - "\u0000\u0279\u027b\u0003|>\u0000\u027a\u0279\u0001\u0000\u0000\u0000\u027b"+ - "\u027c\u0001\u0000\u0000\u0000\u027c\u027a\u0001\u0000\u0000\u0000\u027c"+ - "\u027d\u0001\u0000\u0000\u0000\u027d{\u0001\u0000\u0000\u0000\u027e\u027f"+ - "\u0005i\u0000\u0000\u027f\u0280\u0003~?\u0000\u0280\u0281\u0005j\u0000"+ - "\u0000\u0281}\u0001\u0000\u0000\u0000\u0282\u0283\u0006?\uffff\uffff\u0000"+ - "\u0283\u0284\u0003\u0080@\u0000\u0284\u028a\u0001\u0000\u0000\u0000\u0285"+ - "\u0286\n\u0001\u0000\u0000\u0286\u0287\u00059\u0000\u0000\u0287\u0289"+ - "\u0003\u0080@\u0000\u0288\u0285\u0001\u0000\u0000\u0000\u0289\u028c\u0001"+ - "\u0000\u0000\u0000\u028a\u0288\u0001\u0000\u0000\u0000\u028a\u028b\u0001"+ - "\u0000\u0000\u0000\u028b\u007f\u0001\u0000\u0000\u0000\u028c\u028a\u0001"+ - "\u0000\u0000\u0000\u028d\u028e\u0003\b\u0004\u0000\u028e\u0081\u0001\u0000"+ - "\u0000\u0000\u028f\u0293\u0005\f\u0000\u0000\u0290\u0291\u00034\u001a"+ - "\u0000\u0291\u0292\u0005?\u0000\u0000\u0292\u0294\u0001\u0000\u0000\u0000"+ - "\u0293\u0290\u0001\u0000\u0000\u0000\u0293\u0294\u0001\u0000\u0000\u0000"+ - "\u0294\u0295\u0001\u0000\u0000\u0000\u0295\u0296\u0003\u00b8\\\u0000\u0296"+ - "\u0297\u0005P\u0000\u0000\u0297\u0298\u0003\u0010\b\u0000\u0298\u0299"+ - "\u0003`0\u0000\u0299\u0083\u0001\u0000\u0000\u0000\u029a\u029e\u0005\u0007"+ - "\u0000\u0000\u029b\u029c\u00034\u001a\u0000\u029c\u029d\u0005?\u0000\u0000"+ - "\u029d\u029f\u0001\u0000\u0000\u0000\u029e\u029b\u0001\u0000\u0000\u0000"+ - "\u029e\u029f\u0001\u0000\u0000\u0000\u029f\u02a0\u0001\u0000\u0000\u0000"+ - "\u02a0\u02a1\u0003\u00acV\u0000\u02a1\u02a2\u0003`0\u0000\u02a2\u0085"+ - "\u0001\u0000\u0000\u0000\u02a3\u02a4\u0005\u001b\u0000\u0000\u02a4\u02a5"+ - "\u0005~\u0000\u0000\u02a5\u02a8\u00030\u0018\u0000\u02a6\u02a7\u0005@"+ - "\u0000\u0000\u02a7\u02a9\u0003\u0010\b\u0000\u02a8\u02a6\u0001\u0000\u0000"+ - "\u0000\u02a8\u02a9\u0001\u0000\u0000\u0000\u02a9\u02b1\u0001\u0000\u0000"+ - "\u0000\u02aa\u02ab\u0005\u001c\u0000\u0000\u02ab\u02ae\u00030\u0018\u0000"+ - "\u02ac\u02ad\u0005@\u0000\u0000\u02ad\u02af\u0003\u0010\b\u0000\u02ae"+ - "\u02ac\u0001\u0000\u0000\u0000\u02ae\u02af\u0001\u0000\u0000\u0000\u02af"+ - "\u02b1\u0001\u0000\u0000\u0000\u02b0\u02a3\u0001\u0000\u0000\u0000\u02b0"+ - "\u02aa\u0001\u0000\u0000\u0000\u02b1\u0087\u0001\u0000\u0000\u0000\u02b2"+ - "\u02b4\u0005\u001a\u0000\u0000\u02b3\u02b5\u0003>\u001f\u0000\u02b4\u02b3"+ - "\u0001\u0000\u0000\u0000\u02b4\u02b5\u0001\u0000\u0000\u0000\u02b5\u02b9"+ - "\u0001\u0000\u0000\u0000\u02b6\u02b8\u0003\u008aE\u0000\u02b7\u02b6\u0001"+ - "\u0000\u0000\u0000\u02b8\u02bb\u0001\u0000\u0000\u0000\u02b9\u02b7\u0001"+ - "\u0000\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u0089\u0001"+ - "\u0000\u0000\u0000\u02bb\u02b9\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005"+ - "y\u0000\u0000\u02bd\u02be\u0005@\u0000\u0000\u02be\u02c8\u00034\u001a"+ - "\u0000\u02bf\u02c0\u0005z\u0000\u0000\u02c0\u02c1\u0005@\u0000\u0000\u02c1"+ - "\u02c8\u0003\u008cF\u0000\u02c2\u02c3\u0005x\u0000\u0000\u02c3\u02c4\u0005"+ - "@\u0000\u0000\u02c4\u02c8\u00034\u001a\u0000\u02c5\u02c6\u0005U\u0000"+ - "\u0000\u02c6\u02c8\u0003\u00b2Y\u0000\u02c7\u02bc\u0001\u0000\u0000\u0000"+ - "\u02c7\u02bf\u0001\u0000\u0000\u0000\u02c7\u02c2\u0001\u0000\u0000\u0000"+ - "\u02c7\u02c5\u0001\u0000\u0000\u0000\u02c8\u008b\u0001\u0000\u0000\u0000"+ - "\u02c9\u02ce\u00034\u001a\u0000\u02ca\u02cb\u0005D\u0000\u0000\u02cb\u02cd"+ - "\u00034\u001a\u0000\u02cc\u02ca\u0001\u0000\u0000\u0000\u02cd\u02d0\u0001"+ - "\u0000\u0000\u0000\u02ce\u02cc\u0001\u0000\u0000\u0000\u02ce\u02cf\u0001"+ - "\u0000\u0000\u0000\u02cf\u008d\u0001\u0000\u0000\u0000\u02d0\u02ce\u0001"+ - "\u0000\u0000\u0000\u02d1\u02d2\u0005\u0013\u0000\u0000\u02d2\u008f\u0001"+ - "\u0000\u0000\u0000\u02d3\u02d4\u0005\u0015\u0000\u0000\u02d4\u0091\u0001"+ - "\u0000\u0000\u0000\u02d5\u02d6\u0005!\u0000\u0000\u02d6\u02d7\u0003 \u0010"+ - "\u0000\u02d7\u02d8\u0005P\u0000\u0000\u02d8\u02d9\u0003<\u001e\u0000\u02d9"+ - "\u0093\u0001\u0000\u0000\u0000\u02da\u02db\u0005&\u0000\u0000\u02db\u02dc"+ - "\u0003<\u001e\u0000\u02dc\u0095\u0001\u0000\u0000\u0000\u02dd\u02de\u0005"+ - "\u0012\u0000\u0000\u02de\u02df\u00034\u001a\u0000\u02df\u02e0\u0005?\u0000"+ - "\u0000\u02e0\u02e1\u0003\u00acV\u0000\u02e1\u0097\u0001\u0000\u0000\u0000"+ - "\u02e2\u02e3\u0005\u0014\u0000\u0000\u02e3\u02e4\u00034\u001a\u0000\u02e4"+ - "\u02e5\u0005?\u0000\u0000\u02e5\u02e6\u0003\u00acV\u0000\u02e6\u0099\u0001"+ - "\u0000\u0000\u0000\u02e7\u02e8\u0005)\u0000\u0000\u02e8\u02e9\u0003\u009c"+ - "N\u0000\u02e9\u02ea\u0005C\u0000\u0000\u02ea\u009b\u0001\u0000\u0000\u0000"+ - "\u02eb\u02ec\u0003>\u001f\u0000\u02ec\u02ef\u0005?\u0000\u0000\u02ed\u02f0"+ - "\u0003\u00b8\\\u0000\u02ee\u02f0\u0003\u00b2Y\u0000\u02ef\u02ed\u0001"+ - "\u0000\u0000\u0000\u02ef\u02ee\u0001\u0000\u0000\u0000\u02f0\u009d\u0001"+ - "\u0000\u0000\u0000\u02f1\u02f3\u0005\"\u0000\u0000\u02f2\u02f4\u0003\u00a0"+ - "P\u0000\u02f3\u02f2\u0001\u0000\u0000\u0000\u02f3\u02f4\u0001\u0000\u0000"+ - "\u0000\u02f4\u02f5\u0001\u0000\u0000\u0000\u02f5\u02f6\u0005P\u0000\u0000"+ - "\u02f6\u02f7\u00034\u001a\u0000\u02f7\u02f8\u0005\u008d\u0000\u0000\u02f8"+ - "\u02f9\u0003\u00c0`\u0000\u02f9\u02fa\u0003`0\u0000\u02fa\u009f\u0001"+ - "\u0000\u0000\u0000\u02fb\u02fe\u0003B!\u0000\u02fc\u02fe\u0003\u00acV"+ - "\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02fd\u02fc\u0001\u0000\u0000"+ - "\u0000\u02fe\u00a1\u0001\u0000\u0000\u0000\u02ff\u0300\u0006Q\uffff\uffff"+ - "\u0000\u0300\u0301\u0005M\u0000\u0000\u0301\u031d\u0003\u00a2Q\b\u0302"+ - "\u031d\u0003\u00a8T\u0000\u0303\u031d\u0003\u00a4R\u0000\u0304\u0306\u0003"+ - "\u00a8T\u0000\u0305\u0307\u0005M\u0000\u0000\u0306\u0305\u0001\u0000\u0000"+ - "\u0000\u0306\u0307\u0001\u0000\u0000\u0000\u0307\u0308\u0001\u0000\u0000"+ - "\u0000\u0308\u0309\u0005I\u0000\u0000\u0309\u030a\u0005i\u0000\u0000\u030a"+ - "\u030f\u0003\u00a8T\u0000\u030b\u030c\u0005D\u0000\u0000\u030c\u030e\u0003"+ - "\u00a8T\u0000\u030d\u030b\u0001\u0000\u0000\u0000\u030e\u0311\u0001\u0000"+ - "\u0000\u0000\u030f\u030d\u0001\u0000\u0000\u0000\u030f\u0310\u0001\u0000"+ - "\u0000\u0000\u0310\u0312\u0001\u0000\u0000\u0000\u0311\u030f\u0001\u0000"+ - "\u0000\u0000\u0312\u0313\u0005j\u0000\u0000\u0313\u031d\u0001\u0000\u0000"+ - "\u0000\u0314\u0315\u0003\u00a8T\u0000\u0315\u0317\u0005J\u0000\u0000\u0316"+ - "\u0318\u0005M\u0000\u0000\u0317\u0316\u0001\u0000\u0000\u0000\u0317\u0318"+ - "\u0001\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0319\u031a"+ - "\u0005N\u0000\u0000\u031a\u031d\u0001\u0000\u0000\u0000\u031b\u031d\u0003"+ - "\u00a6S\u0000\u031c\u02ff\u0001\u0000\u0000\u0000\u031c\u0302\u0001\u0000"+ - "\u0000\u0000\u031c\u0303\u0001\u0000\u0000\u0000\u031c\u0304\u0001\u0000"+ - "\u0000\u0000\u031c\u0314\u0001\u0000\u0000\u0000\u031c\u031b\u0001\u0000"+ - "\u0000\u0000\u031d\u0326\u0001\u0000\u0000\u0000\u031e\u031f\n\u0005\u0000"+ - "\u0000\u031f\u0320\u0005=\u0000\u0000\u0320\u0325\u0003\u00a2Q\u0006\u0321"+ - "\u0322\n\u0004\u0000\u0000\u0322\u0323\u0005Q\u0000\u0000\u0323\u0325"+ - "\u0003\u00a2Q\u0005\u0324\u031e\u0001\u0000\u0000\u0000\u0324\u0321\u0001"+ - "\u0000\u0000\u0000\u0325\u0328\u0001\u0000\u0000\u0000\u0326\u0324\u0001"+ - "\u0000\u0000\u0000\u0326\u0327\u0001\u0000\u0000\u0000\u0327\u00a3\u0001"+ - "\u0000\u0000\u0000\u0328\u0326\u0001\u0000\u0000\u0000\u0329\u032b\u0003"+ - "\u00a8T\u0000\u032a\u032c\u0005M\u0000\u0000\u032b\u032a\u0001\u0000\u0000"+ - "\u0000\u032b\u032c\u0001\u0000\u0000\u0000\u032c\u032d\u0001\u0000\u0000"+ - "\u0000\u032d\u032e\u0005L\u0000\u0000\u032e\u032f\u0003H$\u0000\u032f"+ - "\u0358\u0001\u0000\u0000\u0000\u0330\u0332\u0003\u00a8T\u0000\u0331\u0333"+ - "\u0005M\u0000\u0000\u0332\u0331\u0001\u0000\u0000\u0000\u0332\u0333\u0001"+ - "\u0000\u0000\u0000\u0333\u0334\u0001\u0000\u0000\u0000\u0334\u0335\u0005"+ - "S\u0000\u0000\u0335\u0336\u0003H$\u0000\u0336\u0358\u0001\u0000\u0000"+ - "\u0000\u0337\u0339\u0003\u00a8T\u0000\u0338\u033a\u0005M\u0000\u0000\u0339"+ - "\u0338\u0001\u0000\u0000\u0000\u0339\u033a\u0001\u0000\u0000\u0000\u033a"+ - "\u033b\u0001\u0000\u0000\u0000\u033b\u033c\u0005L\u0000\u0000\u033c\u033d"+ - "\u0005i\u0000\u0000\u033d\u0342\u0003H$\u0000\u033e\u033f\u0005D\u0000"+ - "\u0000\u033f\u0341\u0003H$\u0000\u0340\u033e\u0001\u0000\u0000\u0000\u0341"+ - "\u0344\u0001\u0000\u0000\u0000\u0342\u0340\u0001\u0000\u0000\u0000\u0342"+ - "\u0343\u0001\u0000\u0000\u0000\u0343\u0345\u0001\u0000\u0000\u0000\u0344"+ - "\u0342\u0001\u0000\u0000\u0000\u0345\u0346\u0005j\u0000\u0000\u0346\u0358"+ - "\u0001\u0000\u0000\u0000\u0347\u0349\u0003\u00a8T\u0000\u0348\u034a\u0005"+ - "M\u0000\u0000\u0349\u0348\u0001\u0000\u0000\u0000\u0349\u034a\u0001\u0000"+ - "\u0000\u0000\u034a\u034b\u0001\u0000\u0000\u0000\u034b\u034c\u0005S\u0000"+ - "\u0000\u034c\u034d\u0005i\u0000\u0000\u034d\u0352\u0003H$\u0000\u034e"+ - "\u034f\u0005D\u0000\u0000\u034f\u0351\u0003H$\u0000\u0350\u034e\u0001"+ - "\u0000\u0000\u0000\u0351\u0354\u0001\u0000\u0000\u0000\u0352\u0350\u0001"+ - "\u0000\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000\u0353\u0355\u0001"+ - "\u0000\u0000\u0000\u0354\u0352\u0001\u0000\u0000\u0000\u0355\u0356\u0005"+ - "j\u0000\u0000\u0356\u0358\u0001\u0000\u0000\u0000\u0357\u0329\u0001\u0000"+ - "\u0000\u0000\u0357\u0330\u0001\u0000\u0000\u0000\u0357\u0337\u0001\u0000"+ - "\u0000\u0000\u0357\u0347\u0001\u0000\u0000\u0000\u0358\u00a5\u0001\u0000"+ - "\u0000\u0000\u0359\u035c\u00034\u001a\u0000\u035a\u035b\u0005A\u0000\u0000"+ - "\u035b\u035d\u0003\f\u0006\u0000\u035c\u035a\u0001\u0000\u0000\u0000\u035c"+ - "\u035d\u0001\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000\u0000\u035e"+ - "\u035f\u0005B\u0000\u0000\u035f\u0360\u0003\u00b8\\\u0000\u0360\u00a7"+ - "\u0001\u0000\u0000\u0000\u0361\u0367\u0003\u00aaU\u0000\u0362\u0363\u0003"+ - "\u00aaU\u0000\u0363\u0364\u0003\u00c4b\u0000\u0364\u0365\u0003\u00aaU"+ - "\u0000\u0365\u0367\u0001\u0000\u0000\u0000\u0366\u0361\u0001\u0000\u0000"+ - "\u0000\u0366\u0362\u0001\u0000\u0000\u0000\u0367\u00a9\u0001\u0000\u0000"+ - "\u0000\u0368\u0369\u0006U\uffff\uffff\u0000\u0369\u036d\u0003\u00acV\u0000"+ - "\u036a\u036b\u0007\u0005\u0000\u0000\u036b\u036d\u0003\u00aaU\u0003\u036c"+ - "\u0368\u0001\u0000\u0000\u0000\u036c\u036a\u0001\u0000\u0000\u0000\u036d"+ - "\u0376\u0001\u0000\u0000\u0000\u036e\u036f\n\u0002\u0000\u0000\u036f\u0370"+ - "\u0007\u0006\u0000\u0000\u0370\u0375\u0003\u00aaU\u0003\u0371\u0372\n"+ - "\u0001\u0000\u0000\u0372\u0373\u0007\u0005\u0000\u0000\u0373\u0375\u0003"+ - "\u00aaU\u0002\u0374\u036e\u0001\u0000\u0000\u0000\u0374\u0371\u0001\u0000"+ - "\u0000\u0000\u0375\u0378\u0001\u0000\u0000\u0000\u0376\u0374\u0001\u0000"+ - "\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0377\u00ab\u0001\u0000"+ - "\u0000\u0000\u0378\u0376\u0001\u0000\u0000\u0000\u0379\u037a\u0006V\uffff"+ - "\uffff\u0000\u037a\u0382\u0003\u00b8\\\u0000\u037b\u0382\u00034\u001a"+ - "\u0000\u037c\u0382\u0003\u00aeW\u0000\u037d\u037e\u0005i\u0000\u0000\u037e"+ - "\u037f\u0003\u00a2Q\u0000\u037f\u0380\u0005j\u0000\u0000\u0380\u0382\u0001"+ - "\u0000\u0000\u0000\u0381\u0379\u0001\u0000\u0000\u0000\u0381\u037b\u0001"+ - "\u0000\u0000\u0000\u0381\u037c\u0001\u0000\u0000\u0000\u0381\u037d\u0001"+ - "\u0000\u0000\u0000\u0382\u0388\u0001\u0000\u0000\u0000\u0383\u0384\n\u0001"+ - "\u0000\u0000\u0384\u0385\u0005A\u0000\u0000\u0385\u0387\u0003\f\u0006"+ - "\u0000\u0386\u0383\u0001\u0000\u0000\u0000\u0387\u038a\u0001\u0000\u0000"+ - "\u0000\u0388\u0386\u0001\u0000\u0000\u0000\u0388\u0389\u0001\u0000\u0000"+ - "\u0000\u0389\u00ad\u0001\u0000\u0000\u0000\u038a\u0388\u0001\u0000\u0000"+ - "\u0000\u038b\u038c\u0003\u00b0X\u0000\u038c\u039a\u0005i\u0000\u0000\u038d"+ - "\u039b\u0005_\u0000\u0000\u038e\u0393\u0003\u00a2Q\u0000\u038f\u0390\u0005"+ - "D\u0000\u0000\u0390\u0392\u0003\u00a2Q\u0000\u0391\u038f\u0001\u0000\u0000"+ - "\u0000\u0392\u0395\u0001\u0000\u0000\u0000\u0393\u0391\u0001\u0000\u0000"+ - "\u0000\u0393\u0394\u0001\u0000\u0000\u0000\u0394\u0398\u0001\u0000\u0000"+ - "\u0000\u0395\u0393\u0001\u0000\u0000\u0000\u0396\u0397\u0005D\u0000\u0000"+ - "\u0397\u0399\u0003\u00b2Y\u0000\u0398\u0396\u0001\u0000\u0000\u0000\u0398"+ - "\u0399\u0001\u0000\u0000\u0000\u0399\u039b\u0001\u0000\u0000\u0000\u039a"+ - "\u038d\u0001\u0000\u0000\u0000\u039a\u038e\u0001\u0000\u0000\u0000\u039a"+ - "\u039b\u0001\u0000\u0000\u0000\u039b\u039c\u0001\u0000\u0000\u0000\u039c"+ - "\u039d\u0005j\u0000\u0000\u039d\u00af\u0001\u0000\u0000\u0000\u039e\u03a2"+ - "\u0003F#\u0000\u039f\u03a2\u0005H\u0000\u0000\u03a0\u03a2\u0005K\u0000"+ - "\u0000\u03a1\u039e\u0001\u0000\u0000\u0000\u03a1\u039f\u0001\u0000\u0000"+ - "\u0000\u03a1\u03a0\u0001\u0000\u0000\u0000\u03a2\u00b1\u0001\u0000\u0000"+ - "\u0000\u03a3\u03ac\u0005b\u0000\u0000\u03a4\u03a9\u0003\u00b4Z\u0000\u03a5"+ - "\u03a6\u0005D\u0000\u0000\u03a6\u03a8\u0003\u00b4Z\u0000\u03a7\u03a5\u0001"+ - "\u0000\u0000\u0000\u03a8\u03ab\u0001\u0000\u0000\u0000\u03a9\u03a7\u0001"+ - "\u0000\u0000\u0000\u03a9\u03aa\u0001\u0000\u0000\u0000\u03aa\u03ad\u0001"+ - "\u0000\u0000\u0000\u03ab\u03a9\u0001\u0000\u0000\u0000\u03ac\u03a4\u0001"+ - "\u0000\u0000\u0000\u03ac\u03ad\u0001\u0000\u0000\u0000\u03ad\u03ae\u0001"+ - "\u0000\u0000\u0000\u03ae\u03af\u0005c\u0000\u0000\u03af\u00b3\u0001\u0000"+ - "\u0000\u0000\u03b0\u03b1\u0003\u00c2a\u0000\u03b1\u03b2\u0005B\u0000\u0000"+ - "\u03b2\u03b3\u0003\u00b6[\u0000\u03b3\u00b5\u0001\u0000\u0000\u0000\u03b4"+ - "\u03b7\u0003\u00b8\\\u0000\u03b5\u03b7\u0003\u00b2Y\u0000\u03b6\u03b4"+ - "\u0001\u0000\u0000\u0000\u03b6\u03b5\u0001\u0000\u0000\u0000\u03b7\u00b7"+ - "\u0001\u0000\u0000\u0000\u03b8\u03e3\u0005N\u0000\u0000\u03b9\u03ba\u0003"+ - "\u00c0`\u0000\u03ba\u03bb\u0005k\u0000\u0000\u03bb\u03e3\u0001\u0000\u0000"+ - "\u0000\u03bc\u03e3\u0003\u00be_\u0000\u03bd\u03e3\u0003\u00c0`\u0000\u03be"+ - "\u03e3\u0003\u00ba]\u0000\u03bf\u03e3\u0003B!\u0000\u03c0\u03e3\u0003"+ - "\u00c2a\u0000\u03c1\u03c2\u0005g\u0000\u0000\u03c2\u03c7\u0003\u00bc^"+ - "\u0000\u03c3\u03c4\u0005D\u0000\u0000\u03c4\u03c6\u0003\u00bc^\u0000\u03c5"+ - "\u03c3\u0001\u0000\u0000\u0000\u03c6\u03c9\u0001\u0000\u0000\u0000\u03c7"+ - "\u03c5\u0001\u0000\u0000\u0000\u03c7\u03c8\u0001\u0000\u0000\u0000\u03c8"+ - "\u03ca\u0001\u0000\u0000\u0000\u03c9\u03c7\u0001\u0000\u0000\u0000\u03ca"+ - "\u03cb\u0005h\u0000\u0000\u03cb\u03e3\u0001\u0000\u0000\u0000\u03cc\u03cd"+ - "\u0005g\u0000\u0000\u03cd\u03d2\u0003\u00ba]\u0000\u03ce\u03cf\u0005D"+ - "\u0000\u0000\u03cf\u03d1\u0003\u00ba]\u0000\u03d0\u03ce\u0001\u0000\u0000"+ - "\u0000\u03d1\u03d4\u0001\u0000\u0000\u0000\u03d2\u03d0\u0001\u0000\u0000"+ - "\u0000\u03d2\u03d3\u0001\u0000\u0000\u0000\u03d3\u03d5\u0001\u0000\u0000"+ - "\u0000\u03d4\u03d2\u0001\u0000\u0000\u0000\u03d5\u03d6\u0005h\u0000\u0000"+ - "\u03d6\u03e3\u0001\u0000\u0000\u0000\u03d7\u03d8\u0005g\u0000\u0000\u03d8"+ - "\u03dd\u0003\u00c2a\u0000\u03d9\u03da\u0005D\u0000\u0000\u03da\u03dc\u0003"+ - "\u00c2a\u0000\u03db\u03d9\u0001\u0000\u0000\u0000\u03dc\u03df\u0001\u0000"+ - "\u0000\u0000\u03dd\u03db\u0001\u0000\u0000\u0000\u03dd\u03de\u0001\u0000"+ - "\u0000\u0000\u03de\u03e0\u0001\u0000\u0000\u0000\u03df\u03dd\u0001\u0000"+ - "\u0000\u0000\u03e0\u03e1\u0005h\u0000\u0000\u03e1\u03e3\u0001\u0000\u0000"+ - "\u0000\u03e2\u03b8\u0001\u0000\u0000\u0000\u03e2\u03b9\u0001\u0000\u0000"+ - "\u0000\u03e2\u03bc\u0001\u0000\u0000\u0000\u03e2\u03bd\u0001\u0000\u0000"+ - "\u0000\u03e2\u03be\u0001\u0000\u0000\u0000\u03e2\u03bf\u0001\u0000\u0000"+ - "\u0000\u03e2\u03c0\u0001\u0000\u0000\u0000\u03e2\u03c1\u0001\u0000\u0000"+ - "\u0000\u03e2\u03cc\u0001\u0000\u0000\u0000\u03e2\u03d7\u0001\u0000\u0000"+ - "\u0000\u03e3\u00b9\u0001\u0000\u0000\u0000\u03e4\u03e5\u0007\u0007\u0000"+ - "\u0000\u03e5\u00bb\u0001\u0000\u0000\u0000\u03e6\u03e9\u0003\u00be_\u0000"+ - "\u03e7\u03e9\u0003\u00c0`\u0000\u03e8\u03e6\u0001\u0000\u0000\u0000\u03e8"+ - "\u03e7\u0001\u0000\u0000\u0000\u03e9\u00bd\u0001\u0000\u0000\u0000\u03ea"+ - "\u03ec\u0007\u0005\u0000\u0000\u03eb\u03ea\u0001\u0000\u0000\u0000\u03eb"+ - "\u03ec\u0001\u0000\u0000\u0000\u03ec\u03ed\u0001\u0000\u0000\u0000\u03ed"+ - "\u03ee\u0005<\u0000\u0000\u03ee\u00bf\u0001\u0000\u0000\u0000\u03ef\u03f1"+ - "\u0007\u0005\u0000\u0000\u03f0\u03ef\u0001\u0000\u0000\u0000\u03f0\u03f1"+ - "\u0001\u0000\u0000\u0000\u03f1\u03f2\u0001\u0000\u0000\u0000\u03f2\u03f3"+ - "\u0005;\u0000\u0000\u03f3\u00c1\u0001\u0000\u0000\u0000\u03f4\u03f5\u0005"+ - ":\u0000\u0000\u03f5\u00c3\u0001\u0000\u0000\u0000\u03f6\u03f7\u0007\b"+ - "\u0000\u0000\u03f7\u00c5\u0001\u0000\u0000\u0000\u03f8\u03f9\u0007\t\u0000"+ - "\u0000\u03f9\u03fa\u0005\u0082\u0000\u0000\u03fa\u03fb\u0003\u00c8d\u0000"+ - "\u03fb\u03fc\u0003\u00cae\u0000\u03fc\u00c7\u0001\u0000\u0000\u0000\u03fd"+ - "\u03fe\u0004d\u000e\u0000\u03fe\u0400\u0003 \u0010\u0000\u03ff\u0401\u0005"+ - "\u009e\u0000\u0000\u0400\u03ff\u0001\u0000\u0000\u0000\u0400\u0401\u0001"+ - "\u0000\u0000\u0000\u0401\u0402\u0001\u0000\u0000\u0000\u0402\u0403\u0005"+ - "q\u0000\u0000\u0403\u0406\u0001\u0000\u0000\u0000\u0404\u0406\u0003 \u0010"+ - "\u0000\u0405\u03fd\u0001\u0000\u0000\u0000\u0405\u0404\u0001\u0000\u0000"+ - "\u0000\u0406\u00c9\u0001\u0000\u0000\u0000\u0407\u0408\u0005P\u0000\u0000"+ - "\u0408\u040d\u0003\u00a2Q\u0000\u0409\u040a\u0005D\u0000\u0000\u040a\u040c"+ - "\u0003\u00a2Q\u0000\u040b\u0409\u0001\u0000\u0000\u0000\u040c\u040f\u0001"+ - "\u0000\u0000\u0000\u040d\u040b\u0001\u0000\u0000\u0000\u040d\u040e\u0001"+ - "\u0000\u0000\u0000\u040e\u00cb\u0001\u0000\u0000\u0000\u040f\u040d\u0001"+ - "\u0000\u0000\u0000\u0410\u0414\u0005\'\u0000\u0000\u0411\u0413\u0003\u00d0"+ - "h\u0000\u0412\u0411\u0001\u0000\u0000\u0000\u0413\u0416\u0001\u0000\u0000"+ - "\u0000\u0414\u0412\u0001\u0000\u0000\u0000\u0414\u0415\u0001\u0000\u0000"+ - "\u0000\u0415\u041a\u0001\u0000\u0000\u0000\u0416\u0414\u0001\u0000\u0000"+ - "\u0000\u0417\u0418\u0003\u00ceg\u0000\u0418\u0419\u0005?\u0000\u0000\u0419"+ - "\u041b\u0001\u0000\u0000\u0000\u041a\u0417\u0001\u0000\u0000\u0000\u041a"+ - "\u041b\u0001\u0000\u0000\u0000\u041b\u041c\u0001\u0000\u0000\u0000\u041c"+ - "\u041d\u0005i\u0000\u0000\u041d\u041e\u0005e\u0000\u0000\u041e\u044d\u0005"+ - "j\u0000\u0000\u041f\u0423\u0005\'\u0000\u0000\u0420\u0422\u0003\u00d0"+ - "h\u0000\u0421\u0420\u0001\u0000\u0000\u0000\u0422\u0425\u0001\u0000\u0000"+ - "\u0000\u0423\u0421\u0001\u0000\u0000\u0000\u0423\u0424\u0001\u0000\u0000"+ - "\u0000\u0424\u0429\u0001\u0000\u0000\u0000\u0425\u0423\u0001\u0000\u0000"+ - "\u0000\u0426\u0427\u0003\u00ceg\u0000\u0427\u0428\u0005?\u0000\u0000\u0428"+ - "\u042a\u0001\u0000\u0000\u0000\u0429\u0426\u0001\u0000\u0000\u0000\u0429"+ - "\u042a\u0001\u0000\u0000\u0000\u042a\u042b\u0001\u0000\u0000\u0000\u042b"+ - "\u044d\u0005e\u0000\u0000\u042c\u0430\u0005\'\u0000\u0000\u042d\u042f"+ - "\u0003\u00d0h\u0000\u042e\u042d\u0001\u0000\u0000\u0000\u042f\u0432\u0001"+ - "\u0000\u0000\u0000\u0430\u042e\u0001\u0000\u0000\u0000\u0430\u0431\u0001"+ - "\u0000\u0000\u0000\u0431\u0436\u0001\u0000\u0000\u0000\u0432\u0430\u0001"+ - "\u0000\u0000\u0000\u0433\u0434\u0003\u00ceg\u0000\u0434\u0435\u0005?\u0000"+ - "\u0000\u0435\u0437\u0001\u0000\u0000\u0000\u0436\u0433\u0001\u0000\u0000"+ - "\u0000\u0436\u0437\u0001\u0000\u0000\u0000\u0437\u0438\u0001\u0000\u0000"+ - "\u0000\u0438\u043a\u0005i\u0000\u0000\u0439\u043b\u0003\u00d8l\u0000\u043a"+ - "\u0439\u0001\u0000\u0000\u0000\u043b\u043c\u0001\u0000\u0000\u0000\u043c"+ - "\u043a\u0001\u0000\u0000\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d"+ - "\u043e\u0001\u0000\u0000\u0000\u043e\u043f\u0005j\u0000\u0000\u043f\u044d"+ - "\u0001\u0000\u0000\u0000\u0440\u0444\u0005\'\u0000\u0000\u0441\u0443\u0003"+ - "\u00d0h\u0000\u0442\u0441\u0001\u0000\u0000\u0000\u0443\u0446\u0001\u0000"+ - "\u0000\u0000\u0444\u0442\u0001\u0000\u0000\u0000\u0444\u0445\u0001\u0000"+ - "\u0000\u0000\u0445\u0448\u0001\u0000\u0000\u0000\u0446\u0444\u0001\u0000"+ - "\u0000\u0000\u0447\u0449\u0003\u00d8l\u0000\u0448\u0447\u0001\u0000\u0000"+ - "\u0000\u0449\u044a\u0001\u0000\u0000\u0000\u044a\u0448\u0001\u0000\u0000"+ - "\u0000\u044a\u044b\u0001\u0000\u0000\u0000\u044b\u044d\u0001\u0000\u0000"+ - "\u0000\u044c\u0410\u0001\u0000\u0000\u0000\u044c\u041f\u0001\u0000\u0000"+ - "\u0000\u044c\u042c\u0001\u0000\u0000\u0000\u044c\u0440\u0001\u0000\u0000"+ - "\u0000\u044d\u00cd\u0001\u0000\u0000\u0000\u044e\u044f\u0007\u0001\u0000"+ - "\u0000\u044f\u00cf\u0001\u0000\u0000\u0000\u0450\u0451\u0003\u00d2i\u0000"+ - "\u0451\u0452\u0005?\u0000\u0000\u0452\u0453\u0003\u00d4j\u0000\u0453\u00d1"+ - "\u0001\u0000\u0000\u0000\u0454\u0455\u0007\n\u0000\u0000\u0455\u00d3\u0001"+ - "\u0000\u0000\u0000\u0456\u045b\u0003\u00dam\u0000\u0457\u0458\u0005D\u0000"+ - "\u0000\u0458\u045a\u0003\u00dam\u0000\u0459\u0457\u0001\u0000\u0000\u0000"+ - "\u045a\u045d\u0001\u0000\u0000\u0000\u045b\u0459\u0001\u0000\u0000\u0000"+ - "\u045b\u045c\u0001\u0000\u0000\u0000\u045c\u0461\u0001\u0000\u0000\u0000"+ - "\u045d\u045b\u0001\u0000\u0000\u0000\u045e\u0461\u0005l\u0000\u0000\u045f"+ - "\u0461\u0005e\u0000\u0000\u0460\u0456\u0001\u0000\u0000\u0000\u0460\u045e"+ - "\u0001\u0000\u0000\u0000\u0460\u045f\u0001\u0000\u0000\u0000\u0461\u00d5"+ - "\u0001\u0000\u0000\u0000\u0462\u0463\u0007\u000b\u0000\u0000\u0463\u00d7"+ - "\u0001\u0000\u0000\u0000\u0464\u0466\u0003\u00d6k\u0000\u0465\u0464\u0001"+ - "\u0000\u0000\u0000\u0466\u0467\u0001\u0000\u0000\u0000\u0467\u0465\u0001"+ - "\u0000\u0000\u0000\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u0472\u0001"+ - "\u0000\u0000\u0000\u0469\u046d\u0005i\u0000\u0000\u046a\u046c\u0003\u00d8"+ - "l\u0000\u046b\u046a\u0001\u0000\u0000\u0000\u046c\u046f\u0001\u0000\u0000"+ - "\u0000\u046d\u046b\u0001\u0000\u0000\u0000\u046d\u046e\u0001\u0000\u0000"+ - "\u0000\u046e\u0470\u0001\u0000\u0000\u0000\u046f\u046d\u0001\u0000\u0000"+ - "\u0000\u0470\u0472\u0005j\u0000\u0000\u0471\u0465\u0001\u0000\u0000\u0000"+ - "\u0471\u0469\u0001\u0000\u0000\u0000\u0472\u00d9\u0001\u0000\u0000\u0000"+ - "\u0473\u0474\u0003\u00dcn\u0000\u0474\u0475\u0005B\u0000\u0000\u0475\u0476"+ - "\u0003\u00e0p\u0000\u0476\u047d\u0001\u0000\u0000\u0000\u0477\u0478\u0003"+ - "\u00e0p\u0000\u0478\u0479\u0005A\u0000\u0000\u0479\u047a\u0003\u00deo"+ - "\u0000\u047a\u047d\u0001\u0000\u0000\u0000\u047b\u047d\u0003\u00e2q\u0000"+ - "\u047c\u0473\u0001\u0000\u0000\u0000\u047c\u0477\u0001\u0000\u0000\u0000"+ - "\u047c\u047b\u0001\u0000\u0000\u0000\u047d\u00db\u0001\u0000\u0000\u0000"+ - "\u047e\u047f\u0007\f\u0000\u0000\u047f\u00dd\u0001\u0000\u0000\u0000\u0480"+ - "\u0481\u0007\f\u0000\u0000\u0481\u00df\u0001\u0000\u0000\u0000\u0482\u0483"+ - "\u0007\f\u0000\u0000\u0483\u00e1\u0001\u0000\u0000\u0000\u0484\u0485\u0007"+ - "\r\u0000\u0000\u0485\u00e3\u0001\u0000\u0000\u0000r\u00e7\u00f8\u0104"+ - "\u0123\u0132\u0138\u014b\u014f\u0153\u015b\u0163\u0168\u016b\u017b\u0183"+ - "\u0187\u018e\u0194\u0199\u01a2\u01a9\u01af\u01b8\u01bf\u01c7\u01cf\u01d3"+ - "\u01d7\u01dc\u01e0\u01e5\u01ee\u01f7\u01fc\u0200\u020e\u0219\u021f\u0226"+ - "\u022f\u0238\u024c\u0254\u0257\u025e\u026a\u0274\u027c\u028a\u0293\u029e"+ - "\u02a8\u02ae\u02b0\u02b4\u02b9\u02c7\u02ce\u02ef\u02f3\u02fd\u0306\u030f"+ - "\u0317\u031c\u0324\u0326\u032b\u0332\u0339\u0342\u0349\u0352\u0357\u035c"+ - "\u0366\u036c\u0374\u0376\u0381\u0388\u0393\u0398\u039a\u03a1\u03a9\u03ac"+ - "\u03b6\u03c7\u03d2\u03dd\u03e2\u03e8\u03eb\u03f0\u0400\u0405\u040d\u0414"+ - "\u041a\u0423\u0429\u0430\u0436\u043c\u0444\u044a\u044c\u045b\u0460\u0467"+ - "\u046d\u0471\u047c"; + "m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007q\u0002r\u0007"+ + "r\u0001\u0000\u0005\u0000\u00e8\b\u0000\n\u0000\f\u0000\u00eb\t\u0000"+ + "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0005\u0002\u00f9\b\u0002\n\u0002\f\u0002\u00fc\t\u0002\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0003\u0003\u0107\b\u0003\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u0127\b\u0004\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0005\b\u0134\b\b\n\b\f\b\u0137"+ + "\t\b\u0001\t\u0001\t\u0001\t\u0003\t\u013c\b\t\u0001\t\u0001\t\u0001\n"+ + "\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\r\u0001\r\u0001\r\u0005\r\u014d\b\r\n\r\f\r\u0150\t\r"+ + "\u0001\r\u0003\r\u0153\b\r\u0001\u000e\u0001\u000e\u0003\u000e\u0157\b"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f\u015d"+ + "\b\u000f\n\u000f\f\u000f\u0160\t\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0003\u0010\u0167\b\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0003\u0010\u016c\b\u0010\u0001\u0010\u0003\u0010\u016f\b"+ + "\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0013\u0001"+ + "\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0005\u0015\u017d\b\u0015\n\u0015\f\u0015\u0180\t\u0015\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0003\u0017\u0187\b\u0017"+ + "\u0001\u0017\u0001\u0017\u0003\u0017\u018b\b\u0017\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0005\u0018\u0190\b\u0018\n\u0018\f\u0018\u0193\t\u0018\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u0198\b\u0019\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0003\u001a\u019d\b\u001a\u0001\u001a\u0001\u001a\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u01a6"+ + "\b\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u01ab\b\u001b"+ + "\n\u001b\f\u001b\u01ae\t\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0003"+ + "\u001c\u01b3\b\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u01bc\b\u001c\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0005\u001d\u01c1\b\u001d\n\u001d\f\u001d\u01c4\t\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001e\u0005\u001e\u01c9\b\u001e\n\u001e"+ + "\f\u001e\u01cc\t\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0003"+ + " \u01d3\b \u0001!\u0001!\u0003!\u01d7\b!\u0001\"\u0001\"\u0003\"\u01db"+ + "\b\"\u0001#\u0001#\u0001#\u0003#\u01e0\b#\u0001$\u0001$\u0003$\u01e4\b"+ + "$\u0001%\u0001%\u0001%\u0003%\u01e9\b%\u0001&\u0001&\u0001&\u0001&\u0001"+ + "&\u0005&\u01f0\b&\n&\f&\u01f3\t&\u0001\'\u0001\'\u0001\'\u0001\'\u0005"+ + "\'\u01f9\b\'\n\'\f\'\u01fc\t\'\u0001(\u0001(\u0003(\u0200\b(\u0001(\u0001"+ + "(\u0003(\u0204\b(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001+\u0001"+ + "+\u0001+\u0001+\u0005+\u0210\b+\n+\f+\u0213\t+\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0003,\u021d\b,\u0001-\u0001-\u0001-\u0001"+ + "-\u0003-\u0223\b-\u0001.\u0001.\u0001.\u0005.\u0228\b.\n.\f.\u022b\t."+ + "\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00030\u0233\b0\u00011\u0001"+ + "1\u00011\u00011\u00011\u00051\u023a\b1\n1\f1\u023d\t1\u00012\u00012\u0001"+ + "2\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ + "5\u00016\u00016\u00016\u00016\u00036\u0250\b6\u00016\u00016\u00016\u0001"+ + "6\u00056\u0256\b6\n6\f6\u0259\t6\u00036\u025b\b6\u00017\u00017\u00018"+ + "\u00018\u00018\u00038\u0262\b8\u00018\u00018\u00019\u00019\u00019\u0001"+ + ":\u0001:\u0001:\u0005:\u026c\b:\n:\f:\u026f\t:\u0001;\u0001;\u0001;\u0001"+ + ";\u0001;\u0001;\u0001;\u0003;\u0278\b;\u0001<\u0001<\u0001<\u0001=\u0004"+ + "=\u027e\b=\u000b=\f=\u027f\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0005?\u028c\b?\n?\f?\u028f\t?\u0001@\u0001@\u0001"+ + "A\u0001A\u0001A\u0001A\u0003A\u0297\bA\u0001A\u0001A\u0001A\u0001A\u0001"+ + "A\u0001B\u0001B\u0001B\u0001B\u0003B\u02a2\bB\u0001B\u0001B\u0001B\u0001"+ + "C\u0001C\u0001C\u0001C\u0001C\u0003C\u02ac\bC\u0001C\u0001C\u0001C\u0001"+ + "C\u0003C\u02b2\bC\u0003C\u02b4\bC\u0001D\u0001D\u0003D\u02b8\bD\u0001"+ + "D\u0005D\u02bb\bD\nD\fD\u02be\tD\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0001E\u0001E\u0001E\u0003E\u02cb\bE\u0001F\u0001F\u0001"+ + "F\u0005F\u02d0\bF\nF\fF\u02d3\tF\u0001G\u0001G\u0001H\u0001H\u0001I\u0001"+ + "I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0001"+ + "K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001"+ + "M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001"+ + "O\u0003O\u02f9\bO\u0001P\u0001P\u0003P\u02fd\bP\u0001P\u0001P\u0001P\u0001"+ + "P\u0001P\u0001P\u0001Q\u0001Q\u0003Q\u0307\bQ\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0001R\u0003R\u0310\bR\u0001R\u0001R\u0001R\u0001R\u0001"+ + "R\u0005R\u0317\bR\nR\fR\u031a\tR\u0001R\u0001R\u0001R\u0001R\u0001R\u0003"+ + "R\u0321\bR\u0001R\u0001R\u0001R\u0003R\u0326\bR\u0001R\u0001R\u0001R\u0001"+ + "R\u0001R\u0001R\u0005R\u032e\bR\nR\fR\u0331\tR\u0001S\u0001S\u0003S\u0335"+ + "\bS\u0001S\u0001S\u0001S\u0001S\u0001S\u0003S\u033c\bS\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0003S\u0343\bS\u0001S\u0001S\u0001S\u0001S\u0001S\u0005"+ + "S\u034a\bS\nS\fS\u034d\tS\u0001S\u0001S\u0001S\u0001S\u0003S\u0353\bS"+ + "\u0001S\u0001S\u0001S\u0001S\u0001S\u0005S\u035a\bS\nS\fS\u035d\tS\u0001"+ + "S\u0001S\u0003S\u0361\bS\u0001T\u0001T\u0001T\u0003T\u0366\bT\u0001T\u0001"+ + "T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001U\u0003U\u0370\bU\u0001V\u0001"+ + "V\u0001V\u0001V\u0003V\u0376\bV\u0001V\u0001V\u0001V\u0001V\u0001V\u0001"+ + "V\u0005V\u037e\bV\nV\fV\u0381\tV\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001W\u0001W\u0003W\u038b\bW\u0001W\u0001W\u0001W\u0005W\u0390\bW\n"+ + "W\fW\u0393\tW\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0005X\u039b\b"+ + "X\nX\fX\u039e\tX\u0001X\u0001X\u0003X\u03a2\bX\u0003X\u03a4\bX\u0001X"+ + "\u0001X\u0001Y\u0001Y\u0001Y\u0003Y\u03ab\bY\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0005Z\u03b1\bZ\nZ\fZ\u03b4\tZ\u0003Z\u03b6\bZ\u0001Z\u0001Z\u0001["+ + "\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0003\\\u03c0\b\\\u0001]\u0001]"+ + "\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0005]\u03cf\b]\n]\f]\u03d2\t]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0005]\u03da\b]\n]\f]\u03dd\t]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0001]\u0005]\u03e5\b]\n]\f]\u03e8\t]\u0001]\u0001]\u0003]\u03ec\b]"+ + "\u0001^\u0001^\u0001_\u0001_\u0003_\u03f2\b_\u0001`\u0003`\u03f5\b`\u0001"+ + "`\u0001`\u0001a\u0003a\u03fa\ba\u0001a\u0001a\u0001b\u0001b\u0001c\u0001"+ + "c\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0003e\u040a"+ + "\be\u0001e\u0001e\u0001e\u0003e\u040f\be\u0001f\u0001f\u0001f\u0001f\u0005"+ + "f\u0415\bf\nf\ff\u0418\tf\u0001g\u0001g\u0005g\u041c\bg\ng\fg\u041f\t"+ + "g\u0001g\u0001g\u0001g\u0003g\u0424\bg\u0001g\u0001g\u0001g\u0001g\u0001"+ + "g\u0005g\u042b\bg\ng\fg\u042e\tg\u0001g\u0001g\u0001g\u0003g\u0433\bg"+ + "\u0001g\u0001g\u0001g\u0005g\u0438\bg\ng\fg\u043b\tg\u0001g\u0001g\u0001"+ + "g\u0003g\u0440\bg\u0001g\u0001g\u0004g\u0444\bg\u000bg\fg\u0445\u0001"+ + "g\u0001g\u0001g\u0001g\u0005g\u044c\bg\ng\fg\u044f\tg\u0001g\u0004g\u0452"+ + "\bg\u000bg\fg\u0453\u0003g\u0456\bg\u0001h\u0001h\u0001i\u0001i\u0001"+ + "i\u0001i\u0001j\u0001j\u0001k\u0001k\u0001k\u0005k\u0463\bk\nk\fk\u0466"+ + "\tk\u0001k\u0001k\u0003k\u046a\bk\u0001l\u0001l\u0001m\u0004m\u046f\b"+ + "m\u000bm\fm\u0470\u0001m\u0001m\u0005m\u0475\bm\nm\fm\u0478\tm\u0001m"+ + "\u0003m\u047b\bm\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001n\u0001"+ + "n\u0001n\u0003n\u0486\bn\u0001o\u0001o\u0001p\u0001p\u0001q\u0001q\u0001"+ + "r\u0001r\u0001r\u0000\u0005\u0004~\u00a4\u00ac\u00aes\u0000\u0002\u0004"+ + "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ + "$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086"+ + "\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e"+ + "\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6"+ + "\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce"+ + "\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u0000"+ + "\u000e\u0002\u0000;;rr\u0001\u0000lm\u0002\u0000??FF\u0002\u0000IILL\u0002"+ + "\u000000;;\u0001\u0000^_\u0001\u0000`b\u0002\u0000HHUU\u0002\u0000WWY"+ + "]\u0002\u0000\u001e\u001e !\u0003\u0000;;fflm\b\u0000;;@@BCEEfflmrr\u009c"+ + "\u009e\u0002\u0000llrr\u0003\u0000;;llrr\u04c7\u0000\u00e9\u0001\u0000"+ + "\u0000\u0000\u0002\u00ef\u0001\u0000\u0000\u0000\u0004\u00f2\u0001\u0000"+ + "\u0000\u0000\u0006\u0106\u0001\u0000\u0000\u0000\b\u0126\u0001\u0000\u0000"+ + "\u0000\n\u0128\u0001\u0000\u0000\u0000\f\u012b\u0001\u0000\u0000\u0000"+ + "\u000e\u012d\u0001\u0000\u0000\u0000\u0010\u0130\u0001\u0000\u0000\u0000"+ + "\u0012\u013b\u0001\u0000\u0000\u0000\u0014\u013f\u0001\u0000\u0000\u0000"+ + "\u0016\u0142\u0001\u0000\u0000\u0000\u0018\u0145\u0001\u0000\u0000\u0000"+ + "\u001a\u0149\u0001\u0000\u0000\u0000\u001c\u0156\u0001\u0000\u0000\u0000"+ + "\u001e\u0158\u0001\u0000\u0000\u0000 \u016e\u0001\u0000\u0000\u0000\""+ + "\u0170\u0001\u0000\u0000\u0000$\u0172\u0001\u0000\u0000\u0000&\u0174\u0001"+ + "\u0000\u0000\u0000(\u0176\u0001\u0000\u0000\u0000*\u0178\u0001\u0000\u0000"+ + "\u0000,\u0181\u0001\u0000\u0000\u0000.\u0184\u0001\u0000\u0000\u00000"+ + "\u018c\u0001\u0000\u0000\u00002\u0194\u0001\u0000\u0000\u00004\u01a5\u0001"+ + "\u0000\u0000\u00006\u01a7\u0001\u0000\u0000\u00008\u01bb\u0001\u0000\u0000"+ + "\u0000:\u01bd\u0001\u0000\u0000\u0000<\u01c5\u0001\u0000\u0000\u0000>"+ + "\u01cd\u0001\u0000\u0000\u0000@\u01d2\u0001\u0000\u0000\u0000B\u01d6\u0001"+ + "\u0000\u0000\u0000D\u01da\u0001\u0000\u0000\u0000F\u01df\u0001\u0000\u0000"+ + "\u0000H\u01e3\u0001\u0000\u0000\u0000J\u01e5\u0001\u0000\u0000\u0000L"+ + "\u01ea\u0001\u0000\u0000\u0000N\u01f4\u0001\u0000\u0000\u0000P\u01fd\u0001"+ + "\u0000\u0000\u0000R\u0205\u0001\u0000\u0000\u0000T\u0208\u0001\u0000\u0000"+ + "\u0000V\u020b\u0001\u0000\u0000\u0000X\u021c\u0001\u0000\u0000\u0000Z"+ + "\u021e\u0001\u0000\u0000\u0000\\\u0224\u0001\u0000\u0000\u0000^\u022c"+ + "\u0001\u0000\u0000\u0000`\u0232\u0001\u0000\u0000\u0000b\u0234\u0001\u0000"+ + "\u0000\u0000d\u023e\u0001\u0000\u0000\u0000f\u0241\u0001\u0000\u0000\u0000"+ + "h\u0244\u0001\u0000\u0000\u0000j\u0248\u0001\u0000\u0000\u0000l\u024b"+ + "\u0001\u0000\u0000\u0000n\u025c\u0001\u0000\u0000\u0000p\u0261\u0001\u0000"+ + "\u0000\u0000r\u0265\u0001\u0000\u0000\u0000t\u0268\u0001\u0000\u0000\u0000"+ + "v\u0277\u0001\u0000\u0000\u0000x\u0279\u0001\u0000\u0000\u0000z\u027d"+ + "\u0001\u0000\u0000\u0000|\u0281\u0001\u0000\u0000\u0000~\u0285\u0001\u0000"+ + "\u0000\u0000\u0080\u0290\u0001\u0000\u0000\u0000\u0082\u0292\u0001\u0000"+ + "\u0000\u0000\u0084\u029d\u0001\u0000\u0000\u0000\u0086\u02b3\u0001\u0000"+ + "\u0000\u0000\u0088\u02b5\u0001\u0000\u0000\u0000\u008a\u02ca\u0001\u0000"+ + "\u0000\u0000\u008c\u02cc\u0001\u0000\u0000\u0000\u008e\u02d4\u0001\u0000"+ + "\u0000\u0000\u0090\u02d6\u0001\u0000\u0000\u0000\u0092\u02d8\u0001\u0000"+ + "\u0000\u0000\u0094\u02dd\u0001\u0000\u0000\u0000\u0096\u02e0\u0001\u0000"+ + "\u0000\u0000\u0098\u02e5\u0001\u0000\u0000\u0000\u009a\u02ea\u0001\u0000"+ + "\u0000\u0000\u009c\u02f0\u0001\u0000\u0000\u0000\u009e\u02f4\u0001\u0000"+ + "\u0000\u0000\u00a0\u02fa\u0001\u0000\u0000\u0000\u00a2\u0306\u0001\u0000"+ + "\u0000\u0000\u00a4\u0325\u0001\u0000\u0000\u0000\u00a6\u0360\u0001\u0000"+ + "\u0000\u0000\u00a8\u0362\u0001\u0000\u0000\u0000\u00aa\u036f\u0001\u0000"+ + "\u0000\u0000\u00ac\u0375\u0001\u0000\u0000\u0000\u00ae\u038a\u0001\u0000"+ + "\u0000\u0000\u00b0\u0394\u0001\u0000\u0000\u0000\u00b2\u03aa\u0001\u0000"+ + "\u0000\u0000\u00b4\u03ac\u0001\u0000\u0000\u0000\u00b6\u03b9\u0001\u0000"+ + "\u0000\u0000\u00b8\u03bf\u0001\u0000\u0000\u0000\u00ba\u03eb\u0001\u0000"+ + "\u0000\u0000\u00bc\u03ed\u0001\u0000\u0000\u0000\u00be\u03f1\u0001\u0000"+ + "\u0000\u0000\u00c0\u03f4\u0001\u0000\u0000\u0000\u00c2\u03f9\u0001\u0000"+ + "\u0000\u0000\u00c4\u03fd\u0001\u0000\u0000\u0000\u00c6\u03ff\u0001\u0000"+ + "\u0000\u0000\u00c8\u0401\u0001\u0000\u0000\u0000\u00ca\u040e\u0001\u0000"+ + "\u0000\u0000\u00cc\u0410\u0001\u0000\u0000\u0000\u00ce\u0455\u0001\u0000"+ + "\u0000\u0000\u00d0\u0457\u0001\u0000\u0000\u0000\u00d2\u0459\u0001\u0000"+ + "\u0000\u0000\u00d4\u045d\u0001\u0000\u0000\u0000\u00d6\u0469\u0001\u0000"+ + "\u0000\u0000\u00d8\u046b\u0001\u0000\u0000\u0000\u00da\u047a\u0001\u0000"+ + "\u0000\u0000\u00dc\u0485\u0001\u0000\u0000\u0000\u00de\u0487\u0001\u0000"+ + "\u0000\u0000\u00e0\u0489\u0001\u0000\u0000\u0000\u00e2\u048b\u0001\u0000"+ + "\u0000\u0000\u00e4\u048d\u0001\u0000\u0000\u0000\u00e6\u00e8\u0003\u009c"+ + "N\u0000\u00e7\u00e6\u0001\u0000\u0000\u0000\u00e8\u00eb\u0001\u0000\u0000"+ + "\u0000\u00e9\u00e7\u0001\u0000\u0000\u0000\u00e9\u00ea\u0001\u0000\u0000"+ + "\u0000\u00ea\u00ec\u0001\u0000\u0000\u0000\u00eb\u00e9\u0001\u0000\u0000"+ + "\u0000\u00ec\u00ed\u0003\u0002\u0001\u0000\u00ed\u00ee\u0005\u0000\u0000"+ + "\u0001\u00ee\u0001\u0001\u0000\u0000\u0000\u00ef\u00f0\u0003\u0004\u0002"+ + "\u0000\u00f0\u00f1\u0005\u0000\u0000\u0001\u00f1\u0003\u0001\u0000\u0000"+ + "\u0000\u00f2\u00f3\u0006\u0002\uffff\uffff\u0000\u00f3\u00f4\u0003\u0006"+ + "\u0003\u0000\u00f4\u00fa\u0001\u0000\u0000\u0000\u00f5\u00f6\n\u0001\u0000"+ + "\u0000\u00f6\u00f7\u0005:\u0000\u0000\u00f7\u00f9\u0003\b\u0004\u0000"+ + "\u00f8\u00f5\u0001\u0000\u0000\u0000\u00f9\u00fc\u0001\u0000\u0000\u0000"+ + "\u00fa\u00f8\u0001\u0000\u0000\u0000\u00fa\u00fb\u0001\u0000\u0000\u0000"+ + "\u00fb\u0005\u0001\u0000\u0000\u0000\u00fc\u00fa\u0001\u0000\u0000\u0000"+ + "\u00fd\u0107\u0003\u0014\n\u0000\u00fe\u0107\u0003\u000e\u0007\u0000\u00ff"+ + "\u0107\u0003j5\u0000\u0100\u0107\u0003\u0016\u000b\u0000\u0101\u0107\u0003"+ + "\u00ceg\u0000\u0102\u0103\u0004\u0003\u0001\u0000\u0103\u0107\u0003f3"+ + "\u0000\u0104\u0105\u0004\u0003\u0002\u0000\u0105\u0107\u0003\u0018\f\u0000"+ + "\u0106\u00fd\u0001\u0000\u0000\u0000\u0106\u00fe\u0001\u0000\u0000\u0000"+ + "\u0106\u00ff\u0001\u0000\u0000\u0000\u0106\u0100\u0001\u0000\u0000\u0000"+ + "\u0106\u0101\u0001\u0000\u0000\u0000\u0106\u0102\u0001\u0000\u0000\u0000"+ + "\u0106\u0104\u0001\u0000\u0000\u0000\u0107\u0007\u0001\u0000\u0000\u0000"+ + "\u0108\u0127\u0003,\u0016\u0000\u0109\u0127\u0003\n\u0005\u0000\u010a"+ + "\u0127\u0003R)\u0000\u010b\u0127\u0003J%\u0000\u010c\u0127\u0003.\u0017"+ + "\u0000\u010d\u0127\u0003N\'\u0000\u010e\u0127\u0003T*\u0000\u010f\u0127"+ + "\u0003V+\u0000\u0110\u0127\u0003Z-\u0000\u0111\u0127\u0003b1\u0000\u0112"+ + "\u0127\u0003l6\u0000\u0113\u0127\u0003d2\u0000\u0114\u0127\u0003\u00c8"+ + "d\u0000\u0115\u0127\u0003t:\u0000\u0116\u0127\u0003\u0084B\u0000\u0117"+ + "\u0127\u0003r9\u0000\u0118\u0127\u0003x<\u0000\u0119\u0127\u0003\u0082"+ + "A\u0000\u011a\u0127\u0003\u0086C\u0000\u011b\u0127\u0003\u0088D\u0000"+ + "\u011c\u0127\u0003\u0096K\u0000\u011d\u0127\u0003\u008eG\u0000\u011e\u0127"+ + "\u0003\u0098L\u0000\u011f\u0127\u0003\u0090H\u0000\u0120\u0127\u0003\u009a"+ + "M\u0000\u0121\u0127\u0003\u00a0P\u0000\u0122\u0123\u0004\u0004\u0003\u0000"+ + "\u0123\u0127\u0003\u0092I\u0000\u0124\u0125\u0004\u0004\u0004\u0000\u0125"+ + "\u0127\u0003\u0094J\u0000\u0126\u0108\u0001\u0000\u0000\u0000\u0126\u0109"+ + "\u0001\u0000\u0000\u0000\u0126\u010a\u0001\u0000\u0000\u0000\u0126\u010b"+ + "\u0001\u0000\u0000\u0000\u0126\u010c\u0001\u0000\u0000\u0000\u0126\u010d"+ + "\u0001\u0000\u0000\u0000\u0126\u010e\u0001\u0000\u0000\u0000\u0126\u010f"+ + "\u0001\u0000\u0000\u0000\u0126\u0110\u0001\u0000\u0000\u0000\u0126\u0111"+ + "\u0001\u0000\u0000\u0000\u0126\u0112\u0001\u0000\u0000\u0000\u0126\u0113"+ + "\u0001\u0000\u0000\u0000\u0126\u0114\u0001\u0000\u0000\u0000\u0126\u0115"+ + "\u0001\u0000\u0000\u0000\u0126\u0116\u0001\u0000\u0000\u0000\u0126\u0117"+ + "\u0001\u0000\u0000\u0000\u0126\u0118\u0001\u0000\u0000\u0000\u0126\u0119"+ + "\u0001\u0000\u0000\u0000\u0126\u011a\u0001\u0000\u0000\u0000\u0126\u011b"+ + "\u0001\u0000\u0000\u0000\u0126\u011c\u0001\u0000\u0000\u0000\u0126\u011d"+ + "\u0001\u0000\u0000\u0000\u0126\u011e\u0001\u0000\u0000\u0000\u0126\u011f"+ + "\u0001\u0000\u0000\u0000\u0126\u0120\u0001\u0000\u0000\u0000\u0126\u0121"+ + "\u0001\u0000\u0000\u0000\u0126\u0122\u0001\u0000\u0000\u0000\u0126\u0124"+ + "\u0001\u0000\u0000\u0000\u0127\t\u0001\u0000\u0000\u0000\u0128\u0129\u0005"+ + "\u0011\u0000\u0000\u0129\u012a\u0003\u00a4R\u0000\u012a\u000b\u0001\u0000"+ + "\u0000\u0000\u012b\u012c\u0003>\u001f\u0000\u012c\r\u0001\u0000\u0000"+ + "\u0000\u012d\u012e\u0005\r\u0000\u0000\u012e\u012f\u0003\u0010\b\u0000"+ + "\u012f\u000f\u0001\u0000\u0000\u0000\u0130\u0135\u0003\u0012\t\u0000\u0131"+ + "\u0132\u0005E\u0000\u0000\u0132\u0134\u0003\u0012\t\u0000\u0133\u0131"+ + "\u0001\u0000\u0000\u0000\u0134\u0137\u0001\u0000\u0000\u0000\u0135\u0133"+ + "\u0001\u0000\u0000\u0000\u0135\u0136\u0001\u0000\u0000\u0000\u0136\u0011"+ + "\u0001\u0000\u0000\u0000\u0137\u0135\u0001\u0000\u0000\u0000\u0138\u0139"+ + "\u00034\u001a\u0000\u0139\u013a\u0005@\u0000\u0000\u013a\u013c\u0001\u0000"+ + "\u0000\u0000\u013b\u0138\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000"+ + "\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u013e\u0003\u00a4"+ + "R\u0000\u013e\u0013\u0001\u0000\u0000\u0000\u013f\u0140\u0005\u0017\u0000"+ + "\u0000\u0140\u0141\u0003\u001a\r\u0000\u0141\u0015\u0001\u0000\u0000\u0000"+ + "\u0142\u0143\u0005\u0018\u0000\u0000\u0143\u0144\u0003\u001a\r\u0000\u0144"+ + "\u0017\u0001\u0000\u0000\u0000\u0145\u0146\u0005\u0019\u0000\u0000\u0146"+ + "\u0147\u0003H$\u0000\u0147\u0148\u0003`0\u0000\u0148\u0019\u0001\u0000"+ + "\u0000\u0000\u0149\u014e\u0003\u001c\u000e\u0000\u014a\u014b\u0005E\u0000"+ + "\u0000\u014b\u014d\u0003\u001c\u000e\u0000\u014c\u014a\u0001\u0000\u0000"+ + "\u0000\u014d\u0150\u0001\u0000\u0000\u0000\u014e\u014c\u0001\u0000\u0000"+ + "\u0000\u014e\u014f\u0001\u0000\u0000\u0000\u014f\u0152\u0001\u0000\u0000"+ + "\u0000\u0150\u014e\u0001\u0000\u0000\u0000\u0151\u0153\u0003*\u0015\u0000"+ + "\u0152\u0151\u0001\u0000\u0000\u0000\u0152\u0153\u0001\u0000\u0000\u0000"+ + "\u0153\u001b\u0001\u0000\u0000\u0000\u0154\u0157\u0003 \u0010\u0000\u0155"+ + "\u0157\u0003\u001e\u000f\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0156"+ + "\u0155\u0001\u0000\u0000\u0000\u0157\u001d\u0001\u0000\u0000\u0000\u0158"+ + "\u0159\u0005j\u0000\u0000\u0159\u015e\u0003\u0014\n\u0000\u015a\u015b"+ + "\u0005:\u0000\u0000\u015b\u015d\u0003\b\u0004\u0000\u015c\u015a\u0001"+ + "\u0000\u0000\u0000\u015d\u0160\u0001\u0000\u0000\u0000\u015e\u015c\u0001"+ + "\u0000\u0000\u0000\u015e\u015f\u0001\u0000\u0000\u0000\u015f\u0161\u0001"+ + "\u0000\u0000\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0161\u0162\u0005"+ + "k\u0000\u0000\u0162\u001f\u0001\u0000\u0000\u0000\u0163\u0164\u0003\""+ + "\u0011\u0000\u0164\u0165\u0005C\u0000\u0000\u0165\u0167\u0001\u0000\u0000"+ + "\u0000\u0166\u0163\u0001\u0000\u0000\u0000\u0166\u0167\u0001\u0000\u0000"+ + "\u0000\u0167\u0168\u0001\u0000\u0000\u0000\u0168\u016b\u0003&\u0013\u0000"+ + "\u0169\u016a\u0005B\u0000\u0000\u016a\u016c\u0003$\u0012\u0000\u016b\u0169"+ + "\u0001\u0000\u0000\u0000\u016b\u016c\u0001\u0000\u0000\u0000\u016c\u016f"+ + "\u0001\u0000\u0000\u0000\u016d\u016f\u0003(\u0014\u0000\u016e\u0166\u0001"+ + "\u0000\u0000\u0000\u016e\u016d\u0001\u0000\u0000\u0000\u016f!\u0001\u0000"+ + "\u0000\u0000\u0170\u0171\u0005r\u0000\u0000\u0171#\u0001\u0000\u0000\u0000"+ + "\u0172\u0173\u0005r\u0000\u0000\u0173%\u0001\u0000\u0000\u0000\u0174\u0175"+ + "\u0005r\u0000\u0000\u0175\'\u0001\u0000\u0000\u0000\u0176\u0177\u0007"+ + "\u0000\u0000\u0000\u0177)\u0001\u0000\u0000\u0000\u0178\u0179\u0005q\u0000"+ + "\u0000\u0179\u017e\u0005r\u0000\u0000\u017a\u017b\u0005E\u0000\u0000\u017b"+ + "\u017d\u0005r\u0000\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017d\u0180"+ + "\u0001\u0000\u0000\u0000\u017e\u017c\u0001\u0000\u0000\u0000\u017e\u017f"+ + "\u0001\u0000\u0000\u0000\u017f+\u0001\u0000\u0000\u0000\u0180\u017e\u0001"+ + "\u0000\u0000\u0000\u0181\u0182\u0005\t\u0000\u0000\u0182\u0183\u0003\u0010"+ + "\b\u0000\u0183-\u0001\u0000\u0000\u0000\u0184\u0186\u0005\u0010\u0000"+ + "\u0000\u0185\u0187\u00030\u0018\u0000\u0186\u0185\u0001\u0000\u0000\u0000"+ + "\u0186\u0187\u0001\u0000\u0000\u0000\u0187\u018a\u0001\u0000\u0000\u0000"+ + "\u0188\u0189\u0005A\u0000\u0000\u0189\u018b\u0003\u0010\b\u0000\u018a"+ + "\u0188\u0001\u0000\u0000\u0000\u018a\u018b\u0001\u0000\u0000\u0000\u018b"+ + "/\u0001\u0000\u0000\u0000\u018c\u0191\u00032\u0019\u0000\u018d\u018e\u0005"+ + "E\u0000\u0000\u018e\u0190\u00032\u0019\u0000\u018f\u018d\u0001\u0000\u0000"+ + "\u0000\u0190\u0193\u0001\u0000\u0000\u0000\u0191\u018f\u0001\u0000\u0000"+ + "\u0000\u0191\u0192\u0001\u0000\u0000\u0000\u01921\u0001\u0000\u0000\u0000"+ + "\u0193\u0191\u0001\u0000\u0000\u0000\u0194\u0197\u0003\u0012\t\u0000\u0195"+ + "\u0196\u0005\u0011\u0000\u0000\u0196\u0198\u0003\u00a4R\u0000\u0197\u0195"+ + "\u0001\u0000\u0000\u0000\u0197\u0198\u0001\u0000\u0000\u0000\u01983\u0001"+ + "\u0000\u0000\u0000\u0199\u019a\u0004\u001a\u0005\u0000\u019a\u019c\u0005"+ + "h\u0000\u0000\u019b\u019d\u0005l\u0000\u0000\u019c\u019b\u0001\u0000\u0000"+ + "\u0000\u019c\u019d\u0001\u0000\u0000\u0000\u019d\u019e\u0001\u0000\u0000"+ + "\u0000\u019e\u019f\u0005i\u0000\u0000\u019f\u01a0\u0005G\u0000\u0000\u01a0"+ + "\u01a1\u0005h\u0000\u0000\u01a1\u01a2\u00036\u001b\u0000\u01a2\u01a3\u0005"+ + "i\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a6\u00036\u001b"+ + "\u0000\u01a5\u0199\u0001\u0000\u0000\u0000\u01a5\u01a4\u0001\u0000\u0000"+ + "\u0000\u01a65\u0001\u0000\u0000\u0000\u01a7\u01ac\u0003F#\u0000\u01a8"+ + "\u01a9\u0005G\u0000\u0000\u01a9\u01ab\u0003F#\u0000\u01aa\u01a8\u0001"+ + "\u0000\u0000\u0000\u01ab\u01ae\u0001\u0000\u0000\u0000\u01ac\u01aa\u0001"+ + "\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000\u01ad7\u0001\u0000"+ + "\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01af\u01b0\u0004\u001c"+ + "\u0006\u0000\u01b0\u01b2\u0005h\u0000\u0000\u01b1\u01b3\u0005\u0095\u0000"+ + "\u0000\u01b2\u01b1\u0001\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000"+ + "\u0000\u01b3\u01b4\u0001\u0000\u0000\u0000\u01b4\u01b5\u0005i\u0000\u0000"+ + "\u01b5\u01b6\u0005G\u0000\u0000\u01b6\u01b7\u0005h\u0000\u0000\u01b7\u01b8"+ + "\u0003:\u001d\u0000\u01b8\u01b9\u0005i\u0000\u0000\u01b9\u01bc\u0001\u0000"+ + "\u0000\u0000\u01ba\u01bc\u0003:\u001d\u0000\u01bb\u01af\u0001\u0000\u0000"+ + "\u0000\u01bb\u01ba\u0001\u0000\u0000\u0000\u01bc9\u0001\u0000\u0000\u0000"+ + "\u01bd\u01c2\u0003@ \u0000\u01be\u01bf\u0005G\u0000\u0000\u01bf\u01c1"+ + "\u0003@ \u0000\u01c0\u01be\u0001\u0000\u0000\u0000\u01c1\u01c4\u0001\u0000"+ + "\u0000\u0000\u01c2\u01c0\u0001\u0000\u0000\u0000\u01c2\u01c3\u0001\u0000"+ + "\u0000\u0000\u01c3;\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000\u0000"+ + "\u0000\u01c5\u01ca\u00038\u001c\u0000\u01c6\u01c7\u0005E\u0000\u0000\u01c7"+ + "\u01c9\u00038\u001c\u0000\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01cc"+ + "\u0001\u0000\u0000\u0000\u01ca\u01c8\u0001\u0000\u0000\u0000\u01ca\u01cb"+ + "\u0001\u0000\u0000\u0000\u01cb=\u0001\u0000\u0000\u0000\u01cc\u01ca\u0001"+ + "\u0000\u0000\u0000\u01cd\u01ce\u0007\u0001\u0000\u0000\u01ce?\u0001\u0000"+ + "\u0000\u0000\u01cf\u01d3\u0005\u0095\u0000\u0000\u01d0\u01d3\u0003B!\u0000"+ + "\u01d1\u01d3\u0003D\"\u0000\u01d2\u01cf\u0001\u0000\u0000\u0000\u01d2"+ + "\u01d0\u0001\u0000\u0000\u0000\u01d2\u01d1\u0001\u0000\u0000\u0000\u01d3"+ + "A\u0001\u0000\u0000\u0000\u01d4\u01d7\u0005S\u0000\u0000\u01d5\u01d7\u0005"+ + "f\u0000\u0000\u01d6\u01d4\u0001\u0000\u0000\u0000\u01d6\u01d5\u0001\u0000"+ + "\u0000\u0000\u01d7C\u0001\u0000\u0000\u0000\u01d8\u01db\u0005e\u0000\u0000"+ + "\u01d9\u01db\u0005g\u0000\u0000\u01da\u01d8\u0001\u0000\u0000\u0000\u01da"+ + "\u01d9\u0001\u0000\u0000\u0000\u01dbE\u0001\u0000\u0000\u0000\u01dc\u01e0"+ + "\u0003>\u001f\u0000\u01dd\u01e0\u0003B!\u0000\u01de\u01e0\u0003D\"\u0000"+ + "\u01df\u01dc\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000\u0000\u0000"+ + "\u01df\u01de\u0001\u0000\u0000\u0000\u01e0G\u0001\u0000\u0000\u0000\u01e1"+ + "\u01e4\u0003\u00c4b\u0000\u01e2\u01e4\u0003B!\u0000\u01e3\u01e1\u0001"+ + "\u0000\u0000\u0000\u01e3\u01e2\u0001\u0000\u0000\u0000\u01e4I\u0001\u0000"+ + "\u0000\u0000\u01e5\u01e6\u0005\u000b\u0000\u0000\u01e6\u01e8\u0003\u00ba"+ + "]\u0000\u01e7\u01e9\u0003L&\u0000\u01e8\u01e7\u0001\u0000\u0000\u0000"+ + "\u01e8\u01e9\u0001\u0000\u0000\u0000\u01e9K\u0001\u0000\u0000\u0000\u01ea"+ + "\u01eb\u0004&\u0007\u0000\u01eb\u01ec\u0005A\u0000\u0000\u01ec\u01f1\u0003"+ + "\u00a4R\u0000\u01ed\u01ee\u0005E\u0000\u0000\u01ee\u01f0\u0003\u00a4R"+ + "\u0000\u01ef\u01ed\u0001\u0000\u0000\u0000\u01f0\u01f3\u0001\u0000\u0000"+ + "\u0000\u01f1\u01ef\u0001\u0000\u0000\u0000\u01f1\u01f2\u0001\u0000\u0000"+ + "\u0000\u01f2M\u0001\u0000\u0000\u0000\u01f3\u01f1\u0001\u0000\u0000\u0000"+ + "\u01f4\u01f5\u0005\u000f\u0000\u0000\u01f5\u01fa\u0003P(\u0000\u01f6\u01f7"+ + "\u0005E\u0000\u0000\u01f7\u01f9\u0003P(\u0000\u01f8\u01f6\u0001\u0000"+ + "\u0000\u0000\u01f9\u01fc\u0001\u0000\u0000\u0000\u01fa\u01f8\u0001\u0000"+ + "\u0000\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fbO\u0001\u0000\u0000"+ + "\u0000\u01fc\u01fa\u0001\u0000\u0000\u0000\u01fd\u01ff\u0003\u00a4R\u0000"+ + "\u01fe\u0200\u0007\u0002\u0000\u0000\u01ff\u01fe\u0001\u0000\u0000\u0000"+ + "\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0203\u0001\u0000\u0000\u0000"+ + "\u0201\u0202\u0005P\u0000\u0000\u0202\u0204\u0007\u0003\u0000\u0000\u0203"+ + "\u0201\u0001\u0000\u0000\u0000\u0203\u0204\u0001\u0000\u0000\u0000\u0204"+ + "Q\u0001\u0000\u0000\u0000\u0205\u0206\u0005&\u0000\u0000\u0206\u0207\u0003"+ + "<\u001e\u0000\u0207S\u0001\u0000\u0000\u0000\u0208\u0209\u0005%\u0000"+ + "\u0000\u0209\u020a\u0003<\u001e\u0000\u020aU\u0001\u0000\u0000\u0000\u020b"+ + "\u020c\u0005)\u0000\u0000\u020c\u0211\u0003X,\u0000\u020d\u020e\u0005"+ + "E\u0000\u0000\u020e\u0210\u0003X,\u0000\u020f\u020d\u0001\u0000\u0000"+ + "\u0000\u0210\u0213\u0001\u0000\u0000\u0000\u0211\u020f\u0001\u0000\u0000"+ + "\u0000\u0211\u0212\u0001\u0000\u0000\u0000\u0212W\u0001\u0000\u0000\u0000"+ + "\u0213\u0211\u0001\u0000\u0000\u0000\u0214\u0215\u00038\u001c\u0000\u0215"+ + "\u0216\u0005\u009f\u0000\u0000\u0216\u0217\u00038\u001c\u0000\u0217\u021d"+ + "\u0001\u0000\u0000\u0000\u0218\u0219\u00038\u001c\u0000\u0219\u021a\u0005"+ + "@\u0000\u0000\u021a\u021b\u00038\u001c\u0000\u021b\u021d\u0001\u0000\u0000"+ + "\u0000\u021c\u0214\u0001\u0000\u0000\u0000\u021c\u0218\u0001\u0000\u0000"+ + "\u0000\u021dY\u0001\u0000\u0000\u0000\u021e\u021f\u0005\b\u0000\u0000"+ + "\u021f\u0220\u0003\u00aeW\u0000\u0220\u0222\u0003\u00c4b\u0000\u0221\u0223"+ + "\u0003\\.\u0000\u0222\u0221\u0001\u0000\u0000\u0000\u0222\u0223\u0001"+ + "\u0000\u0000\u0000\u0223[\u0001\u0000\u0000\u0000\u0224\u0229\u0003^/"+ + "\u0000\u0225\u0226\u0005E\u0000\u0000\u0226\u0228\u0003^/\u0000\u0227"+ + "\u0225\u0001\u0000\u0000\u0000\u0228\u022b\u0001\u0000\u0000\u0000\u0229"+ + "\u0227\u0001\u0000\u0000\u0000\u0229\u022a\u0001\u0000\u0000\u0000\u022a"+ + "]\u0001\u0000\u0000\u0000\u022b\u0229\u0001\u0000\u0000\u0000\u022c\u022d"+ + "\u0003>\u001f\u0000\u022d\u022e\u0005@\u0000\u0000\u022e\u022f\u0003\u00ba"+ + "]\u0000\u022f_\u0001\u0000\u0000\u0000\u0230\u0231\u0005V\u0000\u0000"+ + "\u0231\u0233\u0003\u00b4Z\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0232"+ + "\u0233\u0001\u0000\u0000\u0000\u0233a\u0001\u0000\u0000\u0000\u0234\u0235"+ + "\u0005\n\u0000\u0000\u0235\u0236\u0003\u00aeW\u0000\u0236\u023b\u0003"+ + "\u00c4b\u0000\u0237\u0238\u0005E\u0000\u0000\u0238\u023a\u0003\u00c4b"+ + "\u0000\u0239\u0237\u0001\u0000\u0000\u0000\u023a\u023d\u0001\u0000\u0000"+ + "\u0000\u023b\u0239\u0001\u0000\u0000\u0000\u023b\u023c\u0001\u0000\u0000"+ + "\u0000\u023cc\u0001\u0000\u0000\u0000\u023d\u023b\u0001\u0000\u0000\u0000"+ + "\u023e\u023f\u0005$\u0000\u0000\u023f\u0240\u00034\u001a\u0000\u0240e"+ + "\u0001\u0000\u0000\u0000\u0241\u0242\u0005\u0006\u0000\u0000\u0242\u0243"+ + "\u0003h4\u0000\u0243g\u0001\u0000\u0000\u0000\u0244\u0245\u0005j\u0000"+ + "\u0000\u0245\u0246\u0003\u0004\u0002\u0000\u0246\u0247\u0005k\u0000\u0000"+ + "\u0247i\u0001\u0000\u0000\u0000\u0248\u0249\u0005+\u0000\u0000\u0249\u024a"+ + "\u0005\u00a6\u0000\u0000\u024ak\u0001\u0000\u0000\u0000\u024b\u024c\u0005"+ + "\u0005\u0000\u0000\u024c\u024f\u0003n7\u0000\u024d\u024e\u0005Q\u0000"+ + "\u0000\u024e\u0250\u00038\u001c\u0000\u024f\u024d\u0001\u0000\u0000\u0000"+ + "\u024f\u0250\u0001\u0000\u0000\u0000\u0250\u025a\u0001\u0000\u0000\u0000"+ + "\u0251\u0252\u0005V\u0000\u0000\u0252\u0257\u0003p8\u0000\u0253\u0254"+ + "\u0005E\u0000\u0000\u0254\u0256\u0003p8\u0000\u0255\u0253\u0001\u0000"+ + "\u0000\u0000\u0256\u0259\u0001\u0000\u0000\u0000\u0257\u0255\u0001\u0000"+ + "\u0000\u0000\u0257\u0258\u0001\u0000\u0000\u0000\u0258\u025b\u0001\u0000"+ + "\u0000\u0000\u0259\u0257\u0001\u0000\u0000\u0000\u025a\u0251\u0001\u0000"+ + "\u0000\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025bm\u0001\u0000\u0000"+ + "\u0000\u025c\u025d\u0007\u0004\u0000\u0000\u025do\u0001\u0000\u0000\u0000"+ + "\u025e\u025f\u00038\u001c\u0000\u025f\u0260\u0005@\u0000\u0000\u0260\u0262"+ + "\u0001\u0000\u0000\u0000\u0261\u025e\u0001\u0000\u0000\u0000\u0261\u0262"+ + "\u0001\u0000\u0000\u0000\u0262\u0263\u0001\u0000\u0000\u0000\u0263\u0264"+ + "\u00038\u001c\u0000\u0264q\u0001\u0000\u0000\u0000\u0265\u0266\u0005\u000e"+ + "\u0000\u0000\u0266\u0267\u0003\u00ba]\u0000\u0267s\u0001\u0000\u0000\u0000"+ + "\u0268\u0269\u0005\u0004\u0000\u0000\u0269\u026d\u00034\u001a\u0000\u026a"+ + "\u026c\u0003v;\u0000\u026b\u026a\u0001\u0000\u0000\u0000\u026c\u026f\u0001"+ + "\u0000\u0000\u0000\u026d\u026b\u0001\u0000\u0000\u0000\u026d\u026e\u0001"+ + "\u0000\u0000\u0000\u026eu\u0001\u0000\u0000\u0000\u026f\u026d\u0001\u0000"+ + "\u0000\u0000\u0270\u0271\u0005Q\u0000\u0000\u0271\u0278\u00034\u001a\u0000"+ + "\u0272\u0273\u0005\u009f\u0000\u0000\u0273\u0274\u00034\u001a\u0000\u0274"+ + "\u0275\u0005E\u0000\u0000\u0275\u0276\u00034\u001a\u0000\u0276\u0278\u0001"+ + "\u0000\u0000\u0000\u0277\u0270\u0001\u0000\u0000\u0000\u0277\u0272\u0001"+ + "\u0000\u0000\u0000\u0278w\u0001\u0000\u0000\u0000\u0279\u027a\u0005\u001a"+ + "\u0000\u0000\u027a\u027b\u0003z=\u0000\u027by\u0001\u0000\u0000\u0000"+ + "\u027c\u027e\u0003|>\u0000\u027d\u027c\u0001\u0000\u0000\u0000\u027e\u027f"+ + "\u0001\u0000\u0000\u0000\u027f\u027d\u0001\u0000\u0000\u0000\u027f\u0280"+ + "\u0001\u0000\u0000\u0000\u0280{\u0001\u0000\u0000\u0000\u0281\u0282\u0005"+ + "j\u0000\u0000\u0282\u0283\u0003~?\u0000\u0283\u0284\u0005k\u0000\u0000"+ + "\u0284}\u0001\u0000\u0000\u0000\u0285\u0286\u0006?\uffff\uffff\u0000\u0286"+ + "\u0287\u0003\u0080@\u0000\u0287\u028d\u0001\u0000\u0000\u0000\u0288\u0289"+ + "\n\u0001\u0000\u0000\u0289\u028a\u0005:\u0000\u0000\u028a\u028c\u0003"+ + "\u0080@\u0000\u028b\u0288\u0001\u0000\u0000\u0000\u028c\u028f\u0001\u0000"+ + "\u0000\u0000\u028d\u028b\u0001\u0000\u0000\u0000\u028d\u028e\u0001\u0000"+ + "\u0000\u0000\u028e\u007f\u0001\u0000\u0000\u0000\u028f\u028d\u0001\u0000"+ + "\u0000\u0000\u0290\u0291\u0003\b\u0004\u0000\u0291\u0081\u0001\u0000\u0000"+ + "\u0000\u0292\u0296\u0005\f\u0000\u0000\u0293\u0294\u00034\u001a\u0000"+ + "\u0294\u0295\u0005@\u0000\u0000\u0295\u0297\u0001\u0000\u0000\u0000\u0296"+ + "\u0293\u0001\u0000\u0000\u0000\u0296\u0297\u0001\u0000\u0000\u0000\u0297"+ + "\u0298\u0001\u0000\u0000\u0000\u0298\u0299\u0003\u00ba]\u0000\u0299\u029a"+ + "\u0005Q\u0000\u0000\u029a\u029b\u0003\u0010\b\u0000\u029b\u029c\u0003"+ + "`0\u0000\u029c\u0083\u0001\u0000\u0000\u0000\u029d\u02a1\u0005\u0007\u0000"+ + "\u0000\u029e\u029f\u00034\u001a\u0000\u029f\u02a0\u0005@\u0000\u0000\u02a0"+ + "\u02a2\u0001\u0000\u0000\u0000\u02a1\u029e\u0001\u0000\u0000\u0000\u02a1"+ + "\u02a2\u0001\u0000\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000\u0000\u02a3"+ + "\u02a4\u0003\u00aeW\u0000\u02a4\u02a5\u0003`0\u0000\u02a5\u0085\u0001"+ + "\u0000\u0000\u0000\u02a6\u02a7\u0005\u001c\u0000\u0000\u02a7\u02a8\u0005"+ + "\u007f\u0000\u0000\u02a8\u02ab\u00030\u0018\u0000\u02a9\u02aa\u0005A\u0000"+ + "\u0000\u02aa\u02ac\u0003\u0010\b\u0000\u02ab\u02a9\u0001\u0000\u0000\u0000"+ + "\u02ab\u02ac\u0001\u0000\u0000\u0000\u02ac\u02b4\u0001\u0000\u0000\u0000"+ + "\u02ad\u02ae\u0005\u001d\u0000\u0000\u02ae\u02b1\u00030\u0018\u0000\u02af"+ + "\u02b0\u0005A\u0000\u0000\u02b0\u02b2\u0003\u0010\b\u0000\u02b1\u02af"+ + "\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000\u02b2\u02b4"+ + "\u0001\u0000\u0000\u0000\u02b3\u02a6\u0001\u0000\u0000\u0000\u02b3\u02ad"+ + "\u0001\u0000\u0000\u0000\u02b4\u0087\u0001\u0000\u0000\u0000\u02b5\u02b7"+ + "\u0005\u001b\u0000\u0000\u02b6\u02b8\u0003>\u001f\u0000\u02b7\u02b6\u0001"+ + "\u0000\u0000\u0000\u02b7\u02b8\u0001\u0000\u0000\u0000\u02b8\u02bc\u0001"+ + "\u0000\u0000\u0000\u02b9\u02bb\u0003\u008aE\u0000\u02ba\u02b9\u0001\u0000"+ + "\u0000\u0000\u02bb\u02be\u0001\u0000\u0000\u0000\u02bc\u02ba\u0001\u0000"+ + "\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000\u0000\u02bd\u0089\u0001\u0000"+ + "\u0000\u0000\u02be\u02bc\u0001\u0000\u0000\u0000\u02bf\u02c0\u0005z\u0000"+ + "\u0000\u02c0\u02c1\u0005A\u0000\u0000\u02c1\u02cb\u00034\u001a\u0000\u02c2"+ + "\u02c3\u0005{\u0000\u0000\u02c3\u02c4\u0005A\u0000\u0000\u02c4\u02cb\u0003"+ + "\u008cF\u0000\u02c5\u02c6\u0005y\u0000\u0000\u02c6\u02c7\u0005A\u0000"+ + "\u0000\u02c7\u02cb\u00034\u001a\u0000\u02c8\u02c9\u0005V\u0000\u0000\u02c9"+ + "\u02cb\u0003\u00b4Z\u0000\u02ca\u02bf\u0001\u0000\u0000\u0000\u02ca\u02c2"+ + "\u0001\u0000\u0000\u0000\u02ca\u02c5\u0001\u0000\u0000\u0000\u02ca\u02c8"+ + "\u0001\u0000\u0000\u0000\u02cb\u008b\u0001\u0000\u0000\u0000\u02cc\u02d1"+ + "\u00034\u001a\u0000\u02cd\u02ce\u0005E\u0000\u0000\u02ce\u02d0\u00034"+ + "\u001a\u0000\u02cf\u02cd\u0001\u0000\u0000\u0000\u02d0\u02d3\u0001\u0000"+ + "\u0000\u0000\u02d1\u02cf\u0001\u0000\u0000\u0000\u02d1\u02d2\u0001\u0000"+ + "\u0000\u0000\u02d2\u008d\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000"+ + "\u0000\u0000\u02d4\u02d5\u0005\u0013\u0000\u0000\u02d5\u008f\u0001\u0000"+ + "\u0000\u0000\u02d6\u02d7\u0005\u0015\u0000\u0000\u02d7\u0091\u0001\u0000"+ + "\u0000\u0000\u02d8\u02d9\u0005\"\u0000\u0000\u02d9\u02da\u0003 \u0010"+ + "\u0000\u02da\u02db\u0005Q\u0000\u0000\u02db\u02dc\u0003<\u001e\u0000\u02dc"+ + "\u0093\u0001\u0000\u0000\u0000\u02dd\u02de\u0005\'\u0000\u0000\u02de\u02df"+ + "\u0003<\u001e\u0000\u02df\u0095\u0001\u0000\u0000\u0000\u02e0\u02e1\u0005"+ + "\u0012\u0000\u0000\u02e1\u02e2\u00034\u001a\u0000\u02e2\u02e3\u0005@\u0000"+ + "\u0000\u02e3\u02e4\u0003\u00aeW\u0000\u02e4\u0097\u0001\u0000\u0000\u0000"+ + "\u02e5\u02e6\u0005\u0014\u0000\u0000\u02e6\u02e7\u00034\u001a\u0000\u02e7"+ + "\u02e8\u0005@\u0000\u0000\u02e8\u02e9\u0003\u00aeW\u0000\u02e9\u0099\u0001"+ + "\u0000\u0000\u0000\u02ea\u02eb\u0005\u0016\u0000\u0000\u02eb\u02ec\u0003"+ + "4\u001a\u0000\u02ec\u02ed\u0005@\u0000\u0000\u02ed\u02ee\u0003\u00aeW"+ + "\u0000\u02ee\u02ef\u0003`0\u0000\u02ef\u009b\u0001\u0000\u0000\u0000\u02f0"+ + "\u02f1\u0005*\u0000\u0000\u02f1\u02f2\u0003\u009eO\u0000\u02f2\u02f3\u0005"+ + "D\u0000\u0000\u02f3\u009d\u0001\u0000\u0000\u0000\u02f4\u02f5\u0003>\u001f"+ + "\u0000\u02f5\u02f8\u0005@\u0000\u0000\u02f6\u02f9\u0003\u00ba]\u0000\u02f7"+ + "\u02f9\u0003\u00b4Z\u0000\u02f8\u02f6\u0001\u0000\u0000\u0000\u02f8\u02f7"+ + "\u0001\u0000\u0000\u0000\u02f9\u009f\u0001\u0000\u0000\u0000\u02fa\u02fc"+ + "\u0005#\u0000\u0000\u02fb\u02fd\u0003\u00a2Q\u0000\u02fc\u02fb\u0001\u0000"+ + "\u0000\u0000\u02fc\u02fd\u0001\u0000\u0000\u0000\u02fd\u02fe\u0001\u0000"+ + "\u0000\u0000\u02fe\u02ff\u0005Q\u0000\u0000\u02ff\u0300\u00034\u001a\u0000"+ + "\u0300\u0301\u0005\u008e\u0000\u0000\u0301\u0302\u0003\u00c2a\u0000\u0302"+ + "\u0303\u0003`0\u0000\u0303\u00a1\u0001\u0000\u0000\u0000\u0304\u0307\u0003"+ + "B!\u0000\u0305\u0307\u0003\u00aeW\u0000\u0306\u0304\u0001\u0000\u0000"+ + "\u0000\u0306\u0305\u0001\u0000\u0000\u0000\u0307\u00a3\u0001\u0000\u0000"+ + "\u0000\u0308\u0309\u0006R\uffff\uffff\u0000\u0309\u030a\u0005N\u0000\u0000"+ + "\u030a\u0326\u0003\u00a4R\b\u030b\u0326\u0003\u00aaU\u0000\u030c\u0326"+ + "\u0003\u00a6S\u0000\u030d\u030f\u0003\u00aaU\u0000\u030e\u0310\u0005N"+ + "\u0000\u0000\u030f\u030e\u0001\u0000\u0000\u0000\u030f\u0310\u0001\u0000"+ + "\u0000\u0000\u0310\u0311\u0001\u0000\u0000\u0000\u0311\u0312\u0005J\u0000"+ + "\u0000\u0312\u0313\u0005j\u0000\u0000\u0313\u0318\u0003\u00aaU\u0000\u0314"+ + "\u0315\u0005E\u0000\u0000\u0315\u0317\u0003\u00aaU\u0000\u0316\u0314\u0001"+ + "\u0000\u0000\u0000\u0317\u031a\u0001\u0000\u0000\u0000\u0318\u0316\u0001"+ + "\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000\u0000\u0319\u031b\u0001"+ + "\u0000\u0000\u0000\u031a\u0318\u0001\u0000\u0000\u0000\u031b\u031c\u0005"+ + "k\u0000\u0000\u031c\u0326\u0001\u0000\u0000\u0000\u031d\u031e\u0003\u00aa"+ + "U\u0000\u031e\u0320\u0005K\u0000\u0000\u031f\u0321\u0005N\u0000\u0000"+ + "\u0320\u031f\u0001\u0000\u0000\u0000\u0320\u0321\u0001\u0000\u0000\u0000"+ + "\u0321\u0322\u0001\u0000\u0000\u0000\u0322\u0323\u0005O\u0000\u0000\u0323"+ + "\u0326\u0001\u0000\u0000\u0000\u0324\u0326\u0003\u00a8T\u0000\u0325\u0308"+ + "\u0001\u0000\u0000\u0000\u0325\u030b\u0001\u0000\u0000\u0000\u0325\u030c"+ + "\u0001\u0000\u0000\u0000\u0325\u030d\u0001\u0000\u0000\u0000\u0325\u031d"+ + "\u0001\u0000\u0000\u0000\u0325\u0324\u0001\u0000\u0000\u0000\u0326\u032f"+ + "\u0001\u0000\u0000\u0000\u0327\u0328\n\u0005\u0000\u0000\u0328\u0329\u0005"+ + ">\u0000\u0000\u0329\u032e\u0003\u00a4R\u0006\u032a\u032b\n\u0004\u0000"+ + "\u0000\u032b\u032c\u0005R\u0000\u0000\u032c\u032e\u0003\u00a4R\u0005\u032d"+ + "\u0327\u0001\u0000\u0000\u0000\u032d\u032a\u0001\u0000\u0000\u0000\u032e"+ + "\u0331\u0001\u0000\u0000\u0000\u032f\u032d\u0001\u0000\u0000\u0000\u032f"+ + "\u0330\u0001\u0000\u0000\u0000\u0330\u00a5\u0001\u0000\u0000\u0000\u0331"+ + "\u032f\u0001\u0000\u0000\u0000\u0332\u0334\u0003\u00aaU\u0000\u0333\u0335"+ + "\u0005N\u0000\u0000\u0334\u0333\u0001\u0000\u0000\u0000\u0334\u0335\u0001"+ + "\u0000\u0000\u0000\u0335\u0336\u0001\u0000\u0000\u0000\u0336\u0337\u0005"+ + "M\u0000\u0000\u0337\u0338\u0003H$\u0000\u0338\u0361\u0001\u0000\u0000"+ + "\u0000\u0339\u033b\u0003\u00aaU\u0000\u033a\u033c\u0005N\u0000\u0000\u033b"+ + "\u033a\u0001\u0000\u0000\u0000\u033b\u033c\u0001\u0000\u0000\u0000\u033c"+ + "\u033d\u0001\u0000\u0000\u0000\u033d\u033e\u0005T\u0000\u0000\u033e\u033f"+ + "\u0003H$\u0000\u033f\u0361\u0001\u0000\u0000\u0000\u0340\u0342\u0003\u00aa"+ + "U\u0000\u0341\u0343\u0005N\u0000\u0000\u0342\u0341\u0001\u0000\u0000\u0000"+ + "\u0342\u0343\u0001\u0000\u0000\u0000\u0343\u0344\u0001\u0000\u0000\u0000"+ + "\u0344\u0345\u0005M\u0000\u0000\u0345\u0346\u0005j\u0000\u0000\u0346\u034b"+ + "\u0003H$\u0000\u0347\u0348\u0005E\u0000\u0000\u0348\u034a\u0003H$\u0000"+ + "\u0349\u0347\u0001\u0000\u0000\u0000\u034a\u034d\u0001\u0000\u0000\u0000"+ + "\u034b\u0349\u0001\u0000\u0000\u0000\u034b\u034c\u0001\u0000\u0000\u0000"+ + "\u034c\u034e\u0001\u0000\u0000\u0000\u034d\u034b\u0001\u0000\u0000\u0000"+ + "\u034e\u034f\u0005k\u0000\u0000\u034f\u0361\u0001\u0000\u0000\u0000\u0350"+ + "\u0352\u0003\u00aaU\u0000\u0351\u0353\u0005N\u0000\u0000\u0352\u0351\u0001"+ + "\u0000\u0000\u0000\u0352\u0353\u0001\u0000\u0000\u0000\u0353\u0354\u0001"+ + "\u0000\u0000\u0000\u0354\u0355\u0005T\u0000\u0000\u0355\u0356\u0005j\u0000"+ + "\u0000\u0356\u035b\u0003H$\u0000\u0357\u0358\u0005E\u0000\u0000\u0358"+ + "\u035a\u0003H$\u0000\u0359\u0357\u0001\u0000\u0000\u0000\u035a\u035d\u0001"+ + "\u0000\u0000\u0000\u035b\u0359\u0001\u0000\u0000\u0000\u035b\u035c\u0001"+ + "\u0000\u0000\u0000\u035c\u035e\u0001\u0000\u0000\u0000\u035d\u035b\u0001"+ + "\u0000\u0000\u0000\u035e\u035f\u0005k\u0000\u0000\u035f\u0361\u0001\u0000"+ + "\u0000\u0000\u0360\u0332\u0001\u0000\u0000\u0000\u0360\u0339\u0001\u0000"+ + "\u0000\u0000\u0360\u0340\u0001\u0000\u0000\u0000\u0360\u0350\u0001\u0000"+ + "\u0000\u0000\u0361\u00a7\u0001\u0000\u0000\u0000\u0362\u0365\u00034\u001a"+ + "\u0000\u0363\u0364\u0005B\u0000\u0000\u0364\u0366\u0003\f\u0006\u0000"+ + "\u0365\u0363\u0001\u0000\u0000\u0000\u0365\u0366\u0001\u0000\u0000\u0000"+ + "\u0366\u0367\u0001\u0000\u0000\u0000\u0367\u0368\u0005C\u0000\u0000\u0368"+ + "\u0369\u0003\u00ba]\u0000\u0369\u00a9\u0001\u0000\u0000\u0000\u036a\u0370"+ + "\u0003\u00acV\u0000\u036b\u036c\u0003\u00acV\u0000\u036c\u036d\u0003\u00c6"+ + "c\u0000\u036d\u036e\u0003\u00acV\u0000\u036e\u0370\u0001\u0000\u0000\u0000"+ + "\u036f\u036a\u0001\u0000\u0000\u0000\u036f\u036b\u0001\u0000\u0000\u0000"+ + "\u0370\u00ab\u0001\u0000\u0000\u0000\u0371\u0372\u0006V\uffff\uffff\u0000"+ + "\u0372\u0376\u0003\u00aeW\u0000\u0373\u0374\u0007\u0005\u0000\u0000\u0374"+ + "\u0376\u0003\u00acV\u0003\u0375\u0371\u0001\u0000\u0000\u0000\u0375\u0373"+ + "\u0001\u0000\u0000\u0000\u0376\u037f\u0001\u0000\u0000\u0000\u0377\u0378"+ + "\n\u0002\u0000\u0000\u0378\u0379\u0007\u0006\u0000\u0000\u0379\u037e\u0003"+ + "\u00acV\u0003\u037a\u037b\n\u0001\u0000\u0000\u037b\u037c\u0007\u0005"+ + "\u0000\u0000\u037c\u037e\u0003\u00acV\u0002\u037d\u0377\u0001\u0000\u0000"+ + "\u0000\u037d\u037a\u0001\u0000\u0000\u0000\u037e\u0381\u0001\u0000\u0000"+ + "\u0000\u037f\u037d\u0001\u0000\u0000\u0000\u037f\u0380\u0001\u0000\u0000"+ + "\u0000\u0380\u00ad\u0001\u0000\u0000\u0000\u0381\u037f\u0001\u0000\u0000"+ + "\u0000\u0382\u0383\u0006W\uffff\uffff\u0000\u0383\u038b\u0003\u00ba]\u0000"+ + "\u0384\u038b\u00034\u001a\u0000\u0385\u038b\u0003\u00b0X\u0000\u0386\u0387"+ + "\u0005j\u0000\u0000\u0387\u0388\u0003\u00a4R\u0000\u0388\u0389\u0005k"+ + "\u0000\u0000\u0389\u038b\u0001\u0000\u0000\u0000\u038a\u0382\u0001\u0000"+ + "\u0000\u0000\u038a\u0384\u0001\u0000\u0000\u0000\u038a\u0385\u0001\u0000"+ + "\u0000\u0000\u038a\u0386\u0001\u0000\u0000\u0000\u038b\u0391\u0001\u0000"+ + "\u0000\u0000\u038c\u038d\n\u0001\u0000\u0000\u038d\u038e\u0005B\u0000"+ + "\u0000\u038e\u0390\u0003\f\u0006\u0000\u038f\u038c\u0001\u0000\u0000\u0000"+ + "\u0390\u0393\u0001\u0000\u0000\u0000\u0391\u038f\u0001\u0000\u0000\u0000"+ + "\u0391\u0392\u0001\u0000\u0000\u0000\u0392\u00af\u0001\u0000\u0000\u0000"+ + "\u0393\u0391\u0001\u0000\u0000\u0000\u0394\u0395\u0003\u00b2Y\u0000\u0395"+ + "\u03a3\u0005j\u0000\u0000\u0396\u03a4\u0005`\u0000\u0000\u0397\u039c\u0003"+ + "\u00a4R\u0000\u0398\u0399\u0005E\u0000\u0000\u0399\u039b\u0003\u00a4R"+ + "\u0000\u039a\u0398\u0001\u0000\u0000\u0000\u039b\u039e\u0001\u0000\u0000"+ + "\u0000\u039c\u039a\u0001\u0000\u0000\u0000\u039c\u039d\u0001\u0000\u0000"+ + "\u0000\u039d\u03a1\u0001\u0000\u0000\u0000\u039e\u039c\u0001\u0000\u0000"+ + "\u0000\u039f\u03a0\u0005E\u0000\u0000\u03a0\u03a2\u0003\u00b4Z\u0000\u03a1"+ + "\u039f\u0001\u0000\u0000\u0000\u03a1\u03a2\u0001\u0000\u0000\u0000\u03a2"+ + "\u03a4\u0001\u0000\u0000\u0000\u03a3\u0396\u0001\u0000\u0000\u0000\u03a3"+ + "\u0397\u0001\u0000\u0000\u0000\u03a3\u03a4\u0001\u0000\u0000\u0000\u03a4"+ + "\u03a5\u0001\u0000\u0000\u0000\u03a5\u03a6\u0005k\u0000\u0000\u03a6\u00b1"+ + "\u0001\u0000\u0000\u0000\u03a7\u03ab\u0003F#\u0000\u03a8\u03ab\u0005I"+ + "\u0000\u0000\u03a9\u03ab\u0005L\u0000\u0000\u03aa\u03a7\u0001\u0000\u0000"+ + "\u0000\u03aa\u03a8\u0001\u0000\u0000\u0000\u03aa\u03a9\u0001\u0000\u0000"+ + "\u0000\u03ab\u00b3\u0001\u0000\u0000\u0000\u03ac\u03b5\u0005c\u0000\u0000"+ + "\u03ad\u03b2\u0003\u00b6[\u0000\u03ae\u03af\u0005E\u0000\u0000\u03af\u03b1"+ + "\u0003\u00b6[\u0000\u03b0\u03ae\u0001\u0000\u0000\u0000\u03b1\u03b4\u0001"+ + "\u0000\u0000\u0000\u03b2\u03b0\u0001\u0000\u0000\u0000\u03b2\u03b3\u0001"+ + "\u0000\u0000\u0000\u03b3\u03b6\u0001\u0000\u0000\u0000\u03b4\u03b2\u0001"+ + "\u0000\u0000\u0000\u03b5\u03ad\u0001\u0000\u0000\u0000\u03b5\u03b6\u0001"+ + "\u0000\u0000\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03b8\u0005"+ + "d\u0000\u0000\u03b8\u00b5\u0001\u0000\u0000\u0000\u03b9\u03ba\u0003\u00c4"+ + "b\u0000\u03ba\u03bb\u0005C\u0000\u0000\u03bb\u03bc\u0003\u00b8\\\u0000"+ + "\u03bc\u00b7\u0001\u0000\u0000\u0000\u03bd\u03c0\u0003\u00ba]\u0000\u03be"+ + "\u03c0\u0003\u00b4Z\u0000\u03bf\u03bd\u0001\u0000\u0000\u0000\u03bf\u03be"+ + "\u0001\u0000\u0000\u0000\u03c0\u00b9\u0001\u0000\u0000\u0000\u03c1\u03ec"+ + "\u0005O\u0000\u0000\u03c2\u03c3\u0003\u00c2a\u0000\u03c3\u03c4\u0005l"+ + "\u0000\u0000\u03c4\u03ec\u0001\u0000\u0000\u0000\u03c5\u03ec\u0003\u00c0"+ + "`\u0000\u03c6\u03ec\u0003\u00c2a\u0000\u03c7\u03ec\u0003\u00bc^\u0000"+ + "\u03c8\u03ec\u0003B!\u0000\u03c9\u03ec\u0003\u00c4b\u0000\u03ca\u03cb"+ + "\u0005h\u0000\u0000\u03cb\u03d0\u0003\u00be_\u0000\u03cc\u03cd\u0005E"+ + "\u0000\u0000\u03cd\u03cf\u0003\u00be_\u0000\u03ce\u03cc\u0001\u0000\u0000"+ + "\u0000\u03cf\u03d2\u0001\u0000\u0000\u0000\u03d0\u03ce\u0001\u0000\u0000"+ + "\u0000\u03d0\u03d1\u0001\u0000\u0000\u0000\u03d1\u03d3\u0001\u0000\u0000"+ + "\u0000\u03d2\u03d0\u0001\u0000\u0000\u0000\u03d3\u03d4\u0005i\u0000\u0000"+ + "\u03d4\u03ec\u0001\u0000\u0000\u0000\u03d5\u03d6\u0005h\u0000\u0000\u03d6"+ + "\u03db\u0003\u00bc^\u0000\u03d7\u03d8\u0005E\u0000\u0000\u03d8\u03da\u0003"+ + "\u00bc^\u0000\u03d9\u03d7\u0001\u0000\u0000\u0000\u03da\u03dd\u0001\u0000"+ + "\u0000\u0000\u03db\u03d9\u0001\u0000\u0000\u0000\u03db\u03dc\u0001\u0000"+ + "\u0000\u0000\u03dc\u03de\u0001\u0000\u0000\u0000\u03dd\u03db\u0001\u0000"+ + "\u0000\u0000\u03de\u03df\u0005i\u0000\u0000\u03df\u03ec\u0001\u0000\u0000"+ + "\u0000\u03e0\u03e1\u0005h\u0000\u0000\u03e1\u03e6\u0003\u00c4b\u0000\u03e2"+ + "\u03e3\u0005E\u0000\u0000\u03e3\u03e5\u0003\u00c4b\u0000\u03e4\u03e2\u0001"+ + "\u0000\u0000\u0000\u03e5\u03e8\u0001\u0000\u0000\u0000\u03e6\u03e4\u0001"+ + "\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7\u03e9\u0001"+ + "\u0000\u0000\u0000\u03e8\u03e6\u0001\u0000\u0000\u0000\u03e9\u03ea\u0005"+ + "i\u0000\u0000\u03ea\u03ec\u0001\u0000\u0000\u0000\u03eb\u03c1\u0001\u0000"+ + "\u0000\u0000\u03eb\u03c2\u0001\u0000\u0000\u0000\u03eb\u03c5\u0001\u0000"+ + "\u0000\u0000\u03eb\u03c6\u0001\u0000\u0000\u0000\u03eb\u03c7\u0001\u0000"+ + "\u0000\u0000\u03eb\u03c8\u0001\u0000\u0000\u0000\u03eb\u03c9\u0001\u0000"+ + "\u0000\u0000\u03eb\u03ca\u0001\u0000\u0000\u0000\u03eb\u03d5\u0001\u0000"+ + "\u0000\u0000\u03eb\u03e0\u0001\u0000\u0000\u0000\u03ec\u00bb\u0001\u0000"+ + "\u0000\u0000\u03ed\u03ee\u0007\u0007\u0000\u0000\u03ee\u00bd\u0001\u0000"+ + "\u0000\u0000\u03ef\u03f2\u0003\u00c0`\u0000\u03f0\u03f2\u0003\u00c2a\u0000"+ + "\u03f1\u03ef\u0001\u0000\u0000\u0000\u03f1\u03f0\u0001\u0000\u0000\u0000"+ + "\u03f2\u00bf\u0001\u0000\u0000\u0000\u03f3\u03f5\u0007\u0005\u0000\u0000"+ + "\u03f4\u03f3\u0001\u0000\u0000\u0000\u03f4\u03f5\u0001\u0000\u0000\u0000"+ + "\u03f5\u03f6\u0001\u0000\u0000\u0000\u03f6\u03f7\u0005=\u0000\u0000\u03f7"+ + "\u00c1\u0001\u0000\u0000\u0000\u03f8\u03fa\u0007\u0005\u0000\u0000\u03f9"+ + "\u03f8\u0001\u0000\u0000\u0000\u03f9\u03fa\u0001\u0000\u0000\u0000\u03fa"+ + "\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0005<\u0000\u0000\u03fc\u00c3"+ + "\u0001\u0000\u0000\u0000\u03fd\u03fe\u0005;\u0000\u0000\u03fe\u00c5\u0001"+ + "\u0000\u0000\u0000\u03ff\u0400\u0007\b\u0000\u0000\u0400\u00c7\u0001\u0000"+ + "\u0000\u0000\u0401\u0402\u0007\t\u0000\u0000\u0402\u0403\u0005\u0083\u0000"+ + "\u0000\u0403\u0404\u0003\u00cae\u0000\u0404\u0405\u0003\u00ccf\u0000\u0405"+ + "\u00c9\u0001\u0000\u0000\u0000\u0406\u0407\u0004e\u000e\u0000\u0407\u0409"+ + "\u0003 \u0010\u0000\u0408\u040a\u0005\u009f\u0000\u0000\u0409\u0408\u0001"+ + "\u0000\u0000\u0000\u0409\u040a\u0001\u0000\u0000\u0000\u040a\u040b\u0001"+ + "\u0000\u0000\u0000\u040b\u040c\u0005r\u0000\u0000\u040c\u040f\u0001\u0000"+ + "\u0000\u0000\u040d\u040f\u0003 \u0010\u0000\u040e\u0406\u0001\u0000\u0000"+ + "\u0000\u040e\u040d\u0001\u0000\u0000\u0000\u040f\u00cb\u0001\u0000\u0000"+ + "\u0000\u0410\u0411\u0005Q\u0000\u0000\u0411\u0416\u0003\u00a4R\u0000\u0412"+ + "\u0413\u0005E\u0000\u0000\u0413\u0415\u0003\u00a4R\u0000\u0414\u0412\u0001"+ + "\u0000\u0000\u0000\u0415\u0418\u0001\u0000\u0000\u0000\u0416\u0414\u0001"+ + "\u0000\u0000\u0000\u0416\u0417\u0001\u0000\u0000\u0000\u0417\u00cd\u0001"+ + "\u0000\u0000\u0000\u0418\u0416\u0001\u0000\u0000\u0000\u0419\u041d\u0005"+ + "(\u0000\u0000\u041a\u041c\u0003\u00d2i\u0000\u041b\u041a\u0001\u0000\u0000"+ + "\u0000\u041c\u041f\u0001\u0000\u0000\u0000\u041d\u041b\u0001\u0000\u0000"+ + "\u0000\u041d\u041e\u0001\u0000\u0000\u0000\u041e\u0423\u0001\u0000\u0000"+ + "\u0000\u041f\u041d\u0001\u0000\u0000\u0000\u0420\u0421\u0003\u00d0h\u0000"+ + "\u0421\u0422\u0005@\u0000\u0000\u0422\u0424\u0001\u0000\u0000\u0000\u0423"+ + "\u0420\u0001\u0000\u0000\u0000\u0423\u0424\u0001\u0000\u0000\u0000\u0424"+ + "\u0425\u0001\u0000\u0000\u0000\u0425\u0426\u0005j\u0000\u0000\u0426\u0427"+ + "\u0005f\u0000\u0000\u0427\u0456\u0005k\u0000\u0000\u0428\u042c\u0005("+ + "\u0000\u0000\u0429\u042b\u0003\u00d2i\u0000\u042a\u0429\u0001\u0000\u0000"+ + "\u0000\u042b\u042e\u0001\u0000\u0000\u0000\u042c\u042a\u0001\u0000\u0000"+ + "\u0000\u042c\u042d\u0001\u0000\u0000\u0000\u042d\u0432\u0001\u0000\u0000"+ + "\u0000\u042e\u042c\u0001\u0000\u0000\u0000\u042f\u0430\u0003\u00d0h\u0000"+ + "\u0430\u0431\u0005@\u0000\u0000\u0431\u0433\u0001\u0000\u0000\u0000\u0432"+ + "\u042f\u0001\u0000\u0000\u0000\u0432\u0433\u0001\u0000\u0000\u0000\u0433"+ + "\u0434\u0001\u0000\u0000\u0000\u0434\u0456\u0005f\u0000\u0000\u0435\u0439"+ + "\u0005(\u0000\u0000\u0436\u0438\u0003\u00d2i\u0000\u0437\u0436\u0001\u0000"+ + "\u0000\u0000\u0438\u043b\u0001\u0000\u0000\u0000\u0439\u0437\u0001\u0000"+ + "\u0000\u0000\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043f\u0001\u0000"+ + "\u0000\u0000\u043b\u0439\u0001\u0000\u0000\u0000\u043c\u043d\u0003\u00d0"+ + "h\u0000\u043d\u043e\u0005@\u0000\u0000\u043e\u0440\u0001\u0000\u0000\u0000"+ + "\u043f\u043c\u0001\u0000\u0000\u0000\u043f\u0440\u0001\u0000\u0000\u0000"+ + "\u0440\u0441\u0001\u0000\u0000\u0000\u0441\u0443\u0005j\u0000\u0000\u0442"+ + "\u0444\u0003\u00dam\u0000\u0443\u0442\u0001\u0000\u0000\u0000\u0444\u0445"+ + "\u0001\u0000\u0000\u0000\u0445\u0443\u0001\u0000\u0000\u0000\u0445\u0446"+ + "\u0001\u0000\u0000\u0000\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0448"+ + "\u0005k\u0000\u0000\u0448\u0456\u0001\u0000\u0000\u0000\u0449\u044d\u0005"+ + "(\u0000\u0000\u044a\u044c\u0003\u00d2i\u0000\u044b\u044a\u0001\u0000\u0000"+ + "\u0000\u044c\u044f\u0001\u0000\u0000\u0000\u044d\u044b\u0001\u0000\u0000"+ + "\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u0451\u0001\u0000\u0000"+ + "\u0000\u044f\u044d\u0001\u0000\u0000\u0000\u0450\u0452\u0003\u00dam\u0000"+ + "\u0451\u0450\u0001\u0000\u0000\u0000\u0452\u0453\u0001\u0000\u0000\u0000"+ + "\u0453\u0451\u0001\u0000\u0000\u0000\u0453\u0454\u0001\u0000\u0000\u0000"+ + "\u0454\u0456\u0001\u0000\u0000\u0000\u0455\u0419\u0001\u0000\u0000\u0000"+ + "\u0455\u0428\u0001\u0000\u0000\u0000\u0455\u0435\u0001\u0000\u0000\u0000"+ + "\u0455\u0449\u0001\u0000\u0000\u0000\u0456\u00cf\u0001\u0000\u0000\u0000"+ + "\u0457\u0458\u0007\u0001\u0000\u0000\u0458\u00d1\u0001\u0000\u0000\u0000"+ + "\u0459\u045a\u0003\u00d4j\u0000\u045a\u045b\u0005@\u0000\u0000\u045b\u045c"+ + "\u0003\u00d6k\u0000\u045c\u00d3\u0001\u0000\u0000\u0000\u045d\u045e\u0007"+ + "\n\u0000\u0000\u045e\u00d5\u0001\u0000\u0000\u0000\u045f\u0464\u0003\u00dc"+ + "n\u0000\u0460\u0461\u0005E\u0000\u0000\u0461\u0463\u0003\u00dcn\u0000"+ + "\u0462\u0460\u0001\u0000\u0000\u0000\u0463\u0466\u0001\u0000\u0000\u0000"+ + "\u0464\u0462\u0001\u0000\u0000\u0000\u0464\u0465\u0001\u0000\u0000\u0000"+ + "\u0465\u046a\u0001\u0000\u0000\u0000\u0466\u0464\u0001\u0000\u0000\u0000"+ + "\u0467\u046a\u0005m\u0000\u0000\u0468\u046a\u0005f\u0000\u0000\u0469\u045f"+ + "\u0001\u0000\u0000\u0000\u0469\u0467\u0001\u0000\u0000\u0000\u0469\u0468"+ + "\u0001\u0000\u0000\u0000\u046a\u00d7\u0001\u0000\u0000\u0000\u046b\u046c"+ + "\u0007\u000b\u0000\u0000\u046c\u00d9\u0001\u0000\u0000\u0000\u046d\u046f"+ + "\u0003\u00d8l\u0000\u046e\u046d\u0001\u0000\u0000\u0000\u046f\u0470\u0001"+ + "\u0000\u0000\u0000\u0470\u046e\u0001\u0000\u0000\u0000\u0470\u0471\u0001"+ + "\u0000\u0000\u0000\u0471\u047b\u0001\u0000\u0000\u0000\u0472\u0476\u0005"+ + "j\u0000\u0000\u0473\u0475\u0003\u00dam\u0000\u0474\u0473\u0001\u0000\u0000"+ + "\u0000\u0475\u0478\u0001\u0000\u0000\u0000\u0476\u0474\u0001\u0000\u0000"+ + "\u0000\u0476\u0477\u0001\u0000\u0000\u0000\u0477\u0479\u0001\u0000\u0000"+ + "\u0000\u0478\u0476\u0001\u0000\u0000\u0000\u0479\u047b\u0005k\u0000\u0000"+ + "\u047a\u046e\u0001\u0000\u0000\u0000\u047a\u0472\u0001\u0000\u0000\u0000"+ + "\u047b\u00db\u0001\u0000\u0000\u0000\u047c\u047d\u0003\u00deo\u0000\u047d"+ + "\u047e\u0005C\u0000\u0000\u047e\u047f\u0003\u00e2q\u0000\u047f\u0486\u0001"+ + "\u0000\u0000\u0000\u0480\u0481\u0003\u00e2q\u0000\u0481\u0482\u0005B\u0000"+ + "\u0000\u0482\u0483\u0003\u00e0p\u0000\u0483\u0486\u0001\u0000\u0000\u0000"+ + "\u0484\u0486\u0003\u00e4r\u0000\u0485\u047c\u0001\u0000\u0000\u0000\u0485"+ + "\u0480\u0001\u0000\u0000\u0000\u0485\u0484\u0001\u0000\u0000\u0000\u0486"+ + "\u00dd\u0001\u0000\u0000\u0000\u0487\u0488\u0007\f\u0000\u0000\u0488\u00df"+ + "\u0001\u0000\u0000\u0000\u0489\u048a\u0007\f\u0000\u0000\u048a\u00e1\u0001"+ + "\u0000\u0000\u0000\u048b\u048c\u0007\f\u0000\u0000\u048c\u00e3\u0001\u0000"+ + "\u0000\u0000\u048d\u048e\u0007\r\u0000\u0000\u048e\u00e5\u0001\u0000\u0000"+ + "\u0000r\u00e9\u00fa\u0106\u0126\u0135\u013b\u014e\u0152\u0156\u015e\u0166"+ + "\u016b\u016e\u017e\u0186\u018a\u0191\u0197\u019c\u01a5\u01ac\u01b2\u01bb"+ + "\u01c2\u01ca\u01d2\u01d6\u01da\u01df\u01e3\u01e8\u01f1\u01fa\u01ff\u0203"+ + "\u0211\u021c\u0222\u0229\u0232\u023b\u024f\u0257\u025a\u0261\u026d\u0277"+ + "\u027f\u028d\u0296\u02a1\u02ab\u02b1\u02b3\u02b7\u02bc\u02ca\u02d1\u02f8"+ + "\u02fc\u0306\u030f\u0318\u0320\u0325\u032d\u032f\u0334\u033b\u0342\u034b"+ + "\u0352\u035b\u0360\u0365\u036f\u0375\u037d\u037f\u038a\u0391\u039c\u03a1"+ + "\u03a3\u03aa\u03b2\u03b5\u03bf\u03d0\u03db\u03e6\u03eb\u03f1\u03f4\u03f9"+ + "\u0409\u040e\u0416\u041d\u0423\u042c\u0432\u0439\u043f\u0445\u044d\u0453"+ + "\u0455\u0464\u0469\u0470\u0476\u047a\u0485"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java index fd9c755de527e..082447ce883e5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java @@ -992,6 +992,18 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener { *

The default implementation does nothing.

*/ @Override public void exitRegisteredDomainCommand(EsqlBaseParser.RegisteredDomainCommandContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUserAgentCommand(EsqlBaseParser.UserAgentCommandContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUserAgentCommand(EsqlBaseParser.UserAgentCommandContext ctx) { } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java index e269cf6af6f60..c45b2be1d5daf 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java @@ -587,6 +587,13 @@ public class EsqlBaseParserBaseVisitor extends AbstractParseTreeVisitor im * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitRegisteredDomainCommand(EsqlBaseParser.RegisteredDomainCommandContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUserAgentCommand(EsqlBaseParser.UserAgentCommandContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java index 3750514caf755..87c01ff523afe 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java @@ -845,6 +845,16 @@ public interface EsqlBaseParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitRegisteredDomainCommand(EsqlBaseParser.RegisteredDomainCommandContext ctx); + /** + * Enter a parse tree produced by {@link EsqlBaseParser#userAgentCommand}. + * @param ctx the parse tree + */ + void enterUserAgentCommand(EsqlBaseParser.UserAgentCommandContext ctx); + /** + * Exit a parse tree produced by {@link EsqlBaseParser#userAgentCommand}. + * @param ctx the parse tree + */ + void exitUserAgentCommand(EsqlBaseParser.UserAgentCommandContext ctx); /** * Enter a parse tree produced by {@link EsqlBaseParser#setCommand}. * @param ctx the parse tree diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java index 896b3dafa8753..1fb92354b5add 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java @@ -514,6 +514,12 @@ public interface EsqlBaseParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitRegisteredDomainCommand(EsqlBaseParser.RegisteredDomainCommandContext ctx); + /** + * Visit a parse tree produced by {@link EsqlBaseParser#userAgentCommand}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUserAgentCommand(EsqlBaseParser.UserAgentCommandContext ctx); /** * Visit a parse tree produced by {@link EsqlBaseParser#setCommand}. * @param ctx the parse tree diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java index 0721e326b82ac..c1beeb337b469 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java @@ -21,6 +21,8 @@ import org.elasticsearch.index.IndexMode; import org.elasticsearch.index.mapper.IdFieldMapper; import org.elasticsearch.transport.RemoteClusterAware; +import org.elasticsearch.useragent.api.UserAgentParsedInfo; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.core.expression.Alias; import org.elasticsearch.xpack.esql.core.expression.Attribute; @@ -84,6 +86,7 @@ import org.elasticsearch.xpack.esql.plan.logical.UnresolvedExternalRelation; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation; import org.elasticsearch.xpack.esql.plan.logical.UriParts; +import org.elasticsearch.xpack.esql.plan.logical.UserAgent; import org.elasticsearch.xpack.esql.plan.logical.fuse.Fuse; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.InferencePlan; @@ -104,6 +107,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.SequencedMap; import java.util.Set; import static java.util.Collections.emptyList; @@ -479,6 +483,123 @@ public PlanFactory visitRegisteredDomainCommand(EsqlBaseParser.RegisteredDomainC return child -> RegisteredDomain.createInitialInstance(source, child, input, outputPrefix); } + @Override + public PlanFactory visitUserAgentCommand(EsqlBaseParser.UserAgentCommandContext ctx) { + Source source = source(ctx); + + Attribute outputPrefix = visitQualifiedName(ctx.qualifiedName()); + if (outputPrefix == null) { + throw new ParsingException(source, "USER_AGENT command requires an output field prefix"); + } + + Expression input = expression(ctx.primaryExpression()); + if (input == null) { + throw new ParsingException(source, "USER_AGENT command requires an input expression"); + } + + return applyUserAgentOptions(source, input, outputPrefix, ctx.commandNamedParameters()); + } + + private PlanFactory applyUserAgentOptions( + Source source, + Expression input, + Attribute outputPrefix, + EsqlBaseParser.CommandNamedParametersContext ctx + ) { + MapExpression optionsExpression = ctx == null ? null : visitCommandNamedParameters(ctx); + + String regexFile = UserAgentParserRegistry.DEFAULT_PARSER_NAME; + boolean extractDeviceType = false; + List properties = List.of("name", "version", "os", "device"); + + if (optionsExpression != null) { + Map optionsMap = optionsExpression.keyFoldedMap(); + + Expression regexFileExpr = optionsMap.remove("regex_file"); + if (regexFileExpr != null) { + if ((regexFileExpr instanceof Literal && DataType.isString(regexFileExpr.dataType())) == false) { + throw new ParsingException(regexFileExpr.source(), "Option [regex_file] must be a string literal"); + } + regexFile = BytesRefs.toString(((Literal) regexFileExpr).value()); + } + + Expression extractDeviceTypeExpr = optionsMap.remove("extract_device_type"); + if (extractDeviceTypeExpr != null) { + if ((extractDeviceTypeExpr instanceof Literal lit && lit.dataType() == DataType.BOOLEAN) == false) { + throw new ParsingException(extractDeviceTypeExpr.source(), "Option [extract_device_type] must be a boolean literal"); + } + extractDeviceType = (Boolean) ((Literal) extractDeviceTypeExpr).value(); + } + + Expression propertiesExpr = optionsMap.remove("properties"); + if (propertiesExpr != null) { + if (propertiesExpr instanceof Literal propLit && propLit.value() instanceof List propList) { + properties = new ArrayList<>(); + for (Object item : propList) { + if (item instanceof BytesRef) { + properties.add(BytesRefs.toString(item)); + } else { + throw new ParsingException(propertiesExpr.source(), "Option [properties] must be a list of string literals"); + } + } + } else { + throw new ParsingException(propertiesExpr.source(), "Option [properties] must be a list of string literals"); + } + } + + // The ingest processor supports an "original" property that includes the raw user-agent string in the output. + // In ES|QL this is unnecessary since the input expression is already available as a column. Silently ignore it + // for compatibility with ingest processor configurations. + optionsMap.remove("original"); + + if (optionsMap.isEmpty() == false) { + throw new ParsingException( + source, + "Invalid option{} {} in USER_AGENT, expected one of [regex_file, extract_device_type, properties]", + optionsMap.size() > 1 ? "s" : "", + optionsMap.keySet() + ); + } + } + + SequencedMap> allFields = UserAgentParsedInfo.getUserAgentInfoFields(); + LinkedHashMap> filteredFields = new LinkedHashMap<>(); + boolean finalExtractDeviceType = extractDeviceType; + for (String property : properties) { + switch (property) { + case "name" -> filteredFields.put(UserAgentParsedInfo.NAME, allFields.get(UserAgentParsedInfo.NAME)); + case "version" -> filteredFields.put(UserAgentParsedInfo.VERSION, allFields.get(UserAgentParsedInfo.VERSION)); + case "os" -> { + filteredFields.put(UserAgentParsedInfo.OS_NAME, allFields.get(UserAgentParsedInfo.OS_NAME)); + filteredFields.put(UserAgentParsedInfo.OS_VERSION, allFields.get(UserAgentParsedInfo.OS_VERSION)); + filteredFields.put(UserAgentParsedInfo.OS_FULL, allFields.get(UserAgentParsedInfo.OS_FULL)); + } + case "device" -> { + filteredFields.put(UserAgentParsedInfo.DEVICE_NAME, allFields.get(UserAgentParsedInfo.DEVICE_NAME)); + if (finalExtractDeviceType) { + filteredFields.put(UserAgentParsedInfo.DEVICE_TYPE, allFields.get(UserAgentParsedInfo.DEVICE_TYPE)); + } + } + default -> throw new ParsingException( + source, + "Unknown property [{}] in USER_AGENT, expected one of [name, version, os, device]", + property + ); + } + } + + String finalRegexFile = regexFile; + return child -> UserAgent.createInitialInstance( + source, + child, + input, + outputPrefix, + finalExtractDeviceType, + finalRegexFile, + filteredFields + ); + } + @Override public PlanFactory visitStatsCommand(EsqlBaseParser.StatsCommandContext ctx) { final ParserUtils.Stats stats = stats(source(ctx), ctx.grouping, ctx.stats); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java index af82b6cabb704..9cc137c96d6cd 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java @@ -34,6 +34,7 @@ import org.elasticsearch.xpack.esql.plan.logical.TopNBy; import org.elasticsearch.xpack.esql.plan.logical.TsInfo; import org.elasticsearch.xpack.esql.plan.logical.UriParts; +import org.elasticsearch.xpack.esql.plan.logical.UserAgent; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; import org.elasticsearch.xpack.esql.plan.logical.join.InlineJoin; @@ -72,6 +73,7 @@ import org.elasticsearch.xpack.esql.plan.physical.TopNExec; import org.elasticsearch.xpack.esql.plan.physical.TsInfoExec; import org.elasticsearch.xpack.esql.plan.physical.UriPartsExec; +import org.elasticsearch.xpack.esql.plan.physical.UserAgentExec; import org.elasticsearch.xpack.esql.plan.physical.inference.CompletionExec; import org.elasticsearch.xpack.esql.plan.physical.inference.RerankExec; @@ -121,7 +123,8 @@ public static List logical() { UriParts.ENTRY, MetricsInfo.ENTRY, RegisteredDomain.ENTRY, - TsInfo.ENTRY + TsInfo.ENTRY, + UserAgent.ENTRY ); } @@ -158,7 +161,8 @@ public static List physical() { UriPartsExec.ENTRY, MetricsInfoExec.ENTRY, RegisteredDomainExec.ENTRY, - TsInfoExec.ENTRY + TsInfoExec.ENTRY, + UserAgentExec.ENTRY ); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/UserAgent.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/UserAgent.java new file mode 100644 index 0000000000000..1edb73f853b88 --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/UserAgent.java @@ -0,0 +1,148 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.plan.logical; + +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.xpack.esql.common.Failures; +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.NodeInfo; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.core.type.DataType; + +import java.io.IOException; +import java.util.List; +import java.util.Objects; +import java.util.SequencedMap; + +import static org.elasticsearch.xpack.esql.common.Failure.fail; + +/** + * The logical plan for the {@code USER_AGENT} command. + */ +public class UserAgent extends CompoundOutputEval { + + public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( + LogicalPlan.class, + "UserAgent", + UserAgent::new + ); + + private final boolean extractDeviceType; + private final String regexFile; + + /** + * Creates the initial logical plan instance, computing output attributes from the filtered output fields. + * The caller (LogicalPlanBuilder) resolves properties and extractDeviceType into the filtered output fields map. + */ + public static UserAgent createInitialInstance( + Source source, + LogicalPlan child, + Expression input, + Attribute outputFieldPrefix, + boolean extractDeviceType, + String regexFile, + SequencedMap> filteredOutputFields + ) { + List outputFieldNames = filteredOutputFields.keySet().stream().toList(); + List outputFieldAttributes = computeOutputAttributes(filteredOutputFields, outputFieldPrefix.name(), source); + return new UserAgent(source, child, input, outputFieldNames, outputFieldAttributes, extractDeviceType, regexFile); + } + + public UserAgent( + Source source, + LogicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes, + boolean extractDeviceType, + String regexFile + ) { + super(source, child, input, outputFieldNames, outputFieldAttributes); + this.extractDeviceType = extractDeviceType; + this.regexFile = regexFile; + } + + public UserAgent(StreamInput in) throws IOException { + super(in); + this.extractDeviceType = in.readBoolean(); + this.regexFile = in.readString(); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeBoolean(extractDeviceType); + out.writeString(regexFile); + } + + @Override + public UserAgent createNewInstance( + Source source, + LogicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + return new UserAgent(source, child, input, outputFieldNames, outputFieldAttributes, this.extractDeviceType, this.regexFile); + } + + @Override + protected NodeInfo info() { + return NodeInfo.create( + this, + UserAgent::new, + child(), + input, + outputFieldNames(), + generatedAttributes(), + extractDeviceType, + regexFile + ); + } + + @Override + protected int innerHashCode() { + return Objects.hash(extractDeviceType, regexFile); + } + + @Override + protected boolean innerEquals(CompoundOutputEval other) { + return other instanceof UserAgent ua && extractDeviceType == ua.extractDeviceType && Objects.equals(regexFile, ua.regexFile); + } + + @Override + public String getWriteableName() { + return ENTRY.name; + } + + @Override + public String telemetryLabel() { + return "USER_AGENT"; + } + + @Override + public void postAnalysisVerification(Failures failures) { + if (input.resolved()) { + DataType type = input.dataType(); + if (DataType.isNull(type) == false && DataType.isString(type) == false) { + failures.add(fail(input, "Input for USER_AGENT must be of type [string] but is [{}]", type.typeName())); + } + } + } + + public boolean extractDeviceType() { + return extractDeviceType; + } + + public String regexFile() { + return regexFile; + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExec.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExec.java index 9eb18f2e3ea21..a16b93d9897e4 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExec.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/CompoundOutputEvalExec.java @@ -14,7 +14,6 @@ import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.tree.NodeInfo; import org.elasticsearch.xpack.esql.core.tree.Source; -import org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator; import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput; import java.io.IOException; @@ -26,10 +25,7 @@ /** * Abstract base class for physical plans that produce compound outputs from a single input. */ -public abstract class CompoundOutputEvalExec extends UnaryExec - implements - EstimatesRowSize, - CompoundOutputEvaluator.OutputFieldsCollectorProvider { +public abstract class CompoundOutputEvalExec extends UnaryExec implements EstimatesRowSize { /** * The input by which the evaluation is performed. diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/RegisteredDomainExec.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/RegisteredDomainExec.java index 221deac124bbd..210cdbba7acae 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/RegisteredDomainExec.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/RegisteredDomainExec.java @@ -21,7 +21,7 @@ /** * Physical plan for the REGISTERED_DOMAIN command. */ -public class RegisteredDomainExec extends CompoundOutputEvalExec { +public class RegisteredDomainExec extends CompoundOutputEvalExec implements CompoundOutputEvaluator.OutputFieldsCollectorProvider { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( PhysicalPlan.class, diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExec.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExec.java index bc472b83017cf..db50274d4b4e7 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExec.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UriPartsExec.java @@ -21,7 +21,7 @@ /** * Physical plan for the URI_PARTS command. */ -public class UriPartsExec extends CompoundOutputEvalExec { +public class UriPartsExec extends CompoundOutputEvalExec implements CompoundOutputEvaluator.OutputFieldsCollectorProvider { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( PhysicalPlan.class, diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UserAgentExec.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UserAgentExec.java new file mode 100644 index 0000000000000..2473e4096eeea --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/UserAgentExec.java @@ -0,0 +1,110 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.plan.physical; + +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.NodeInfo; +import org.elasticsearch.xpack.esql.core.tree.Source; + +import java.io.IOException; +import java.util.List; +import java.util.Objects; + +/** + * Physical plan for the USER_AGENT command. + */ +public class UserAgentExec extends CompoundOutputEvalExec { + + public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( + PhysicalPlan.class, + "UserAgentExec", + UserAgentExec::new + ); + + private final boolean extractDeviceType; + private final String regexFile; + + public UserAgentExec( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes, + boolean extractDeviceType, + String regexFile + ) { + super(source, child, input, outputFieldNames, outputFieldAttributes); + this.extractDeviceType = extractDeviceType; + this.regexFile = regexFile; + } + + public UserAgentExec(StreamInput in) throws IOException { + super(in); + this.extractDeviceType = in.readBoolean(); + this.regexFile = in.readString(); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeBoolean(extractDeviceType); + out.writeString(regexFile); + } + + @Override + public String getWriteableName() { + return ENTRY.name; + } + + @Override + protected NodeInfo info() { + return NodeInfo.create( + this, + UserAgentExec::new, + child(), + input, + outputFieldNames(), + outputFieldAttributes(), + extractDeviceType, + regexFile + ); + } + + @Override + public CompoundOutputEvalExec createNewInstance( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + return new UserAgentExec(source, child, input, outputFieldNames, outputFieldAttributes, this.extractDeviceType, this.regexFile); + } + + @Override + protected boolean innerEquals(CompoundOutputEvalExec other) { + return other instanceof UserAgentExec ua && extractDeviceType == ua.extractDeviceType && Objects.equals(regexFile, ua.regexFile); + } + + @Override + protected int innerHashCode() { + return Objects.hash(extractDeviceType, regexFile); + } + + public boolean extractDeviceType() { + return extractDeviceType; + } + + public String regexFile() { + return regexFile; + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java index 4714a37bc32a1..c143e28dd2313 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java @@ -88,6 +88,8 @@ import org.elasticsearch.tasks.CancellableTask; import org.elasticsearch.transport.RemoteClusterAware; import org.elasticsearch.transport.Transport; +import org.elasticsearch.useragent.api.UserAgentParser; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; import org.elasticsearch.xpack.esql.EsqlIllegalArgumentException; import org.elasticsearch.xpack.esql.core.expression.Alias; import org.elasticsearch.xpack.esql.core.expression.Attribute; @@ -122,6 +124,7 @@ import org.elasticsearch.xpack.esql.evaluator.EvalMapper; import org.elasticsearch.xpack.esql.evaluator.command.CompoundOutputEvaluator; import org.elasticsearch.xpack.esql.evaluator.command.GrokEvaluatorExtracter; +import org.elasticsearch.xpack.esql.evaluator.command.UserAgentFunctionBridge; import org.elasticsearch.xpack.esql.expression.Foldables; import org.elasticsearch.xpack.esql.expression.Order; import org.elasticsearch.xpack.esql.inference.InferenceService; @@ -157,6 +160,7 @@ import org.elasticsearch.xpack.esql.plan.physical.OutputExec; import org.elasticsearch.xpack.esql.plan.physical.PhysicalPlan; import org.elasticsearch.xpack.esql.plan.physical.ProjectExec; +import org.elasticsearch.xpack.esql.plan.physical.RegisteredDomainExec; import org.elasticsearch.xpack.esql.plan.physical.SampleExec; import org.elasticsearch.xpack.esql.plan.physical.ShowExec; import org.elasticsearch.xpack.esql.plan.physical.SparklineGenerateEmptyBucketsExec; @@ -164,6 +168,8 @@ import org.elasticsearch.xpack.esql.plan.physical.TopNByExec; import org.elasticsearch.xpack.esql.plan.physical.TopNExec; import org.elasticsearch.xpack.esql.plan.physical.TsInfoExec; +import org.elasticsearch.xpack.esql.plan.physical.UriPartsExec; +import org.elasticsearch.xpack.esql.plan.physical.UserAgentExec; import org.elasticsearch.xpack.esql.plan.physical.inference.CompletionExec; import org.elasticsearch.xpack.esql.plan.physical.inference.RerankExec; import org.elasticsearch.xpack.esql.planner.EsPhysicalOperationProviders.ShardContext; @@ -208,6 +214,7 @@ public class LocalExecutionPlanner { private final EnrichLookupService enrichLookupService; private final LookupFromIndexService lookupFromIndexService; private final InferenceService inferenceService; + private final UserAgentParserRegistry userAgentParserRegistry; private final PhysicalOperationProviders physicalOperationProviders; private final OperatorFactoryRegistry operatorFactoryRegistry; @@ -224,6 +231,7 @@ public LocalExecutionPlanner( EnrichLookupService enrichLookupService, LookupFromIndexService lookupFromIndexService, InferenceService inferenceService, + UserAgentParserRegistry userAgentParserRegistry, PhysicalOperationProviders physicalOperationProviders, OperatorFactoryRegistry operatorFactoryRegistry ) { @@ -240,6 +248,7 @@ public LocalExecutionPlanner( this.enrichLookupService = enrichLookupService; this.lookupFromIndexService = lookupFromIndexService; this.inferenceService = inferenceService; + this.userAgentParserRegistry = userAgentParserRegistry; this.physicalOperationProviders = physicalOperationProviders; this.operatorFactoryRegistry = operatorFactoryRegistry; } @@ -332,8 +341,12 @@ private PhysicalOperation plan(PhysicalPlan node, LocalExecutionPlannerContext c return planCompletion(completion, context); } else if (node instanceof SampleExec Sample) { return planSample(Sample, context); - } else if (node instanceof CompoundOutputEvalExec coe) { - return planCompoundOutputEval(coe, context); + } else if (node instanceof UserAgentExec userAgent) { + return planUserAgent(userAgent, context); + } else if (node instanceof UriPartsExec uriParts) { + return planUriParts(uriParts, context); + } else if (node instanceof RegisteredDomainExec rd) { + return planRegisteredDomain(rd, context); } else if (node instanceof MetricsInfoExec metricsInfo) { return planMetricsInfo(metricsInfo, context); } else if (node instanceof TsInfoExec tsInfo) { @@ -393,7 +406,38 @@ private PhysicalOperation planMMR(MMRExec mmr, LocalExecutionPlannerContext cont return source.with(new MMROperator.Factory(diversifyField, diversifyFieldChannel, limit, queryVector, lambdaValue), source.layout); } - private PhysicalOperation planCompoundOutputEval(final CompoundOutputEvalExec coe, LocalExecutionPlannerContext context) { + private PhysicalOperation planUserAgent(UserAgentExec exec, LocalExecutionPlannerContext context) { + UserAgentParser parser = userAgentParserRegistry.getParser(exec.regexFile()); + if (parser == null) { + throw new EsqlIllegalArgumentException("Unknown user-agent regex file [" + exec.regexFile() + "]"); + } + CompoundOutputEvaluator.OutputFieldsCollectorProvider provider = new CompoundOutputEvaluator.OutputFieldsCollectorProvider() { + @Override + public CompoundOutputEvaluator.OutputFieldsCollector createOutputFieldsCollector() { + return new UserAgentFunctionBridge.UserAgentCollectorImpl(exec.outputFieldNames(), parser, exec.extractDeviceType()); + } + + @Override + public String collectorSimpleName() { + return UserAgentFunctionBridge.UserAgentCollectorImpl.class.getSimpleName(); + } + }; + return planCompoundOutputEval(exec, provider, context); + } + + private PhysicalOperation planUriParts(UriPartsExec uriParts, LocalExecutionPlannerContext context) { + return planCompoundOutputEval(uriParts, uriParts, context); + } + + private PhysicalOperation planRegisteredDomain(RegisteredDomainExec rd, LocalExecutionPlannerContext context) { + return planCompoundOutputEval(rd, rd, context); + } + + private PhysicalOperation planCompoundOutputEval( + final CompoundOutputEvalExec coe, + CompoundOutputEvaluator.OutputFieldsCollectorProvider provider, + LocalExecutionPlannerContext context + ) { PhysicalOperation source = plan(coe.child(), context); Layout.Builder layoutBuilder = source.layout.builder(); layoutBuilder.append(coe.outputFieldAttributes()); @@ -409,7 +453,7 @@ private PhysicalOperation planCompoundOutputEval(final CompoundOutputEvalExec co new ColumnExtractOperator.Factory( types, EvalMapper.toEvaluator(context.foldCtx(), coe.input(), layout), - new CompoundOutputEvaluator.Factory(coe.input().dataType(), coe.source(), coe) + new CompoundOutputEvaluator.Factory(coe.input().dataType(), coe.source(), provider) ), layout ); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java index 587f5ec0c10be..4ea81f66d72e9 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java @@ -31,6 +31,7 @@ import org.elasticsearch.xpack.esql.plan.logical.TimeSeriesAggregate; import org.elasticsearch.xpack.esql.plan.logical.UnaryPlan; import org.elasticsearch.xpack.esql.plan.logical.UriParts; +import org.elasticsearch.xpack.esql.plan.logical.UserAgent; import org.elasticsearch.xpack.esql.plan.logical.fuse.FuseScoreEval; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; @@ -56,6 +57,7 @@ import org.elasticsearch.xpack.esql.plan.physical.SparklineGenerateEmptyBucketsExec; import org.elasticsearch.xpack.esql.plan.physical.TimeSeriesAggregateExec; import org.elasticsearch.xpack.esql.plan.physical.UriPartsExec; +import org.elasticsearch.xpack.esql.plan.physical.UserAgentExec; import org.elasticsearch.xpack.esql.plan.physical.inference.CompletionExec; import org.elasticsearch.xpack.esql.plan.physical.inference.RerankExec; import org.elasticsearch.xpack.esql.planner.AbstractPhysicalOperationProviders; @@ -198,6 +200,18 @@ static PhysicalPlan mapUnary(UnaryPlan p, PhysicalPlan child) { return new RegisteredDomainExec(rd.source(), child, rd.getInput(), rd.outputFieldNames(), rd.generatedAttributes()); } + if (p instanceof UserAgent ua) { + return new UserAgentExec( + ua.source(), + child, + ua.getInput(), + ua.outputFieldNames(), + ua.generatedAttributes(), + ua.extractDeviceType(), + ua.regexFile() + ); + } + return unsupported(p); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java index 4b2613aea7193..a81675569fa7a 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java @@ -50,6 +50,7 @@ import org.elasticsearch.transport.RemoteClusterAware; import org.elasticsearch.transport.TransportException; import org.elasticsearch.transport.TransportService; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; import org.elasticsearch.xpack.esql.action.EsqlExecutionInfo; import org.elasticsearch.xpack.esql.action.EsqlQueryAction; import org.elasticsearch.xpack.esql.core.expression.Attribute; @@ -163,6 +164,7 @@ public class ComputeService { private final EnrichLookupService enrichLookupService; private final LookupFromIndexService lookupFromIndexService; private final InferenceService inferenceService; + private final UserAgentParserRegistry userAgentParserRegistry; private final ClusterService clusterService; private final ProjectResolver projectResolver; private final AtomicLong childSessionIdGenerator = new AtomicLong(); @@ -196,6 +198,7 @@ public ComputeService( this.enrichLookupService = enrichLookupService; this.lookupFromIndexService = lookupFromIndexService; this.inferenceService = transportActionServices.inferenceService(); + this.userAgentParserRegistry = transportActionServices.userAgentParserRegistry(); this.clusterService = transportActionServices.clusterService(); this.projectResolver = transportActionServices.projectResolver(); this.dataNodeComputeHandler = new DataNodeComputeHandler( @@ -1073,6 +1076,7 @@ void runCompute( enrichLookupService, lookupFromIndexService, inferenceService, + userAgentParserRegistry, physicalOperationProviders, operatorFactoryRegistry ); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportActionServices.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportActionServices.java index d93b27473ec38..3811d780a2a6c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportActionServices.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportActionServices.java @@ -16,6 +16,7 @@ import org.elasticsearch.search.crossproject.CrossProjectModeDecider; import org.elasticsearch.transport.TransportService; import org.elasticsearch.usage.UsageService; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; import org.elasticsearch.xpack.esql.inference.InferenceService; import org.elasticsearch.xpack.esql.planner.PlannerSettings; @@ -28,6 +29,7 @@ public record TransportActionServices( IndexNameExpressionResolver indexNameExpressionResolver, UsageService usageService, InferenceService inferenceService, + UserAgentParserRegistry userAgentParserRegistry, BlockFactoryProvider blockFactoryProvider, PlannerSettings.Holder plannerSettings, CrossProjectModeDecider crossProjectModeDecider diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java index 8e5d085fbe8be..7354d9454ffea 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/TransportEsqlQueryAction.java @@ -46,6 +46,7 @@ import org.elasticsearch.transport.RemoteClusterService; import org.elasticsearch.transport.TransportService; import org.elasticsearch.usage.UsageService; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; import org.elasticsearch.xpack.core.XPackPlugin; import org.elasticsearch.xpack.core.async.AsyncExecutionId; import org.elasticsearch.xpack.esql.VerificationException; @@ -134,6 +135,7 @@ public TransportEsqlQueryAction( NamedWriteableRegistry registry, IndexNameExpressionResolver indexNameExpressionResolver, UsageService usageService, + UserAgentParserRegistry userAgentParserRegistry, ActionLoggingFieldsProvider fieldProvider, ActivityLogWriterProvider logWriterProvider, CrossProjectModeDecider crossProjectModeDecider @@ -205,6 +207,7 @@ public TransportEsqlQueryAction( indexNameExpressionResolver, usageService, new InferenceService(client, clusterService), + userAgentParserRegistry, blockFactoryProvider, new PlannerSettings.Holder(clusterService), crossProjectModeDecider diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java index 9f8e1fdda20de..5013163447ad8 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/telemetry/FeatureMetric.java @@ -41,6 +41,7 @@ import org.elasticsearch.xpack.esql.plan.logical.UnresolvedExternalRelation; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation; import org.elasticsearch.xpack.esql.plan.logical.UriParts; +import org.elasticsearch.xpack.esql.plan.logical.UserAgent; import org.elasticsearch.xpack.esql.plan.logical.fuse.Fuse; import org.elasticsearch.xpack.esql.plan.logical.fuse.FuseScoreEval; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; @@ -110,7 +111,8 @@ public enum FeatureMetric { URI_PARTS(UriParts.class::isInstance), METRICS_INFO(MetricsInfo.class::isInstance), REGISTERED_DOMAIN(RegisteredDomain.class::isInstance), - TS_INFO(TsInfo.class::isInstance); + TS_INFO(TsInfo.class::isInstance), + USER_AGENT(UserAgent.class::isInstance); /** * List here plans we want to exclude from telemetry diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java index 5ab90f89bbc85..d5d13100d37eb 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java @@ -42,6 +42,8 @@ import org.elasticsearch.core.Releasables; import org.elasticsearch.core.TimeValue; import org.elasticsearch.core.Tuple; +import org.elasticsearch.env.Environment; +import org.elasticsearch.env.TestEnvironment; import org.elasticsearch.index.IndexMode; import org.elasticsearch.logging.LogManager; import org.elasticsearch.logging.Logger; @@ -52,6 +54,8 @@ import org.elasticsearch.threadpool.TestThreadPool; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.RemoteClusterService; +import org.elasticsearch.useragent.UserAgentPlugin; +import org.elasticsearch.useragent.api.UserAgentParserRegistry; import org.elasticsearch.xcontent.XContentParserConfiguration; import org.elasticsearch.xcontent.json.JsonXContent; import org.elasticsearch.xpack.core.enrich.EnrichPolicy; @@ -143,6 +147,7 @@ import org.junit.Before; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.net.URL; import java.nio.file.Files; @@ -962,6 +967,13 @@ void executeSubPlan( ExchangeSourceHandler exchangeSource = new ExchangeSourceHandler(between(1, 64), executor); ExchangeSinkHandler exchangeSink = new ExchangeSinkHandler(blockFactory, between(1, 64), threadPool::relativeTimeInMillis); + UserAgentParserRegistry userAgentRegistry; + try { + userAgentRegistry = createUserAgentRegistry(); + } catch (IOException e) { + throw new IllegalStateException("Failed to create UserAgentParserRegistry", e); + } + LocalExecutionPlanner executionPlanner = new LocalExecutionPlanner( getTestName(), "", @@ -975,6 +987,7 @@ void executeSubPlan( mock(EnrichLookupService.class), mock(LookupFromIndexService.class), mock(InferenceService.class), + userAgentRegistry, physicalOperationProviders, operatorFactoryRegistry ); @@ -1087,4 +1100,22 @@ private static List coordinatorSplits(OperatorFactoryRegistry ope } return coordinatorSplits; } + + /** + * Creates a {@link UserAgentParserRegistry} with a config directory + * containing the custom-regexes.yml test resource, so csv-spec tests can exercise the {@code regex_file} option. + */ + private static UserAgentParserRegistry createUserAgentRegistry() throws IOException { + Path homeDir = createTempDir(); + Path userAgentConfigDir = homeDir.resolve("config").resolve("user-agent"); + Files.createDirectories(userAgentConfigDir); + try (InputStream is = CsvTests.class.getResourceAsStream("/custom-regexes.yml")) { + assert is != null : "custom-regexes.yml not found on classpath"; + Files.copy(is, userAgentConfigDir.resolve("custom-regexes.yml")); + } + return UserAgentPlugin.createRegistry( + TestEnvironment.newEnvironment(Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), homeDir).build()), + Settings.EMPTY + ); + } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java index 14bbeeafb0f33..10a8aa06d6e20 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java @@ -111,6 +111,7 @@ import org.elasticsearch.xpack.esql.plan.logical.UnionAll; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation; import org.elasticsearch.xpack.esql.plan.logical.UriParts; +import org.elasticsearch.xpack.esql.plan.logical.UserAgent; import org.elasticsearch.xpack.esql.plan.logical.ViewUnionAll; import org.elasticsearch.xpack.esql.plan.logical.fuse.FuseScoreEval; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; @@ -6376,6 +6377,32 @@ public void testRegisteredDomain() { ); } + public void testUserAgent() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + LogicalPlan plan = basic().query("ROW ua=\"Mozilla/5.0\" | user_agent p = ua WITH { \"extract_device_type\": true }"); + + Limit limit = as(plan, Limit.class); + UserAgent userAgent = as(limit.child(), UserAgent.class); + + final List attributes = userAgent.generatedAttributes(); + + assertThrows(UnsupportedOperationException.class, () -> attributes.add(new UnresolvedAttribute(EMPTY, "test"))); + + assertContainsAttribute(attributes, "p.name", DataType.KEYWORD); + assertContainsAttribute(attributes, "p.version", DataType.KEYWORD); + assertContainsAttribute(attributes, "p.os.name", DataType.KEYWORD); + assertContainsAttribute(attributes, "p.os.version", DataType.KEYWORD); + assertContainsAttribute(attributes, "p.os.full", DataType.KEYWORD); + assertContainsAttribute(attributes, "p.device.name", DataType.KEYWORD); + assertContainsAttribute(attributes, "p.device.type", DataType.KEYWORD); + assertEquals(7, attributes.size()); + + basic().error( + "ROW ua=123 | user_agent p = ua WITH { \"extract_device_type\": true }", + containsString("Input for USER_AGENT must be of type [string] but is [integer]") + ); + } + private void assertContainsAttribute(List attributes, String expectedName, DataType expectedType) { Attribute attr = attributes.stream().filter(a -> a.name().equals(expectedName)).findFirst().orElse(null); assertNotNull("Expected attribute " + expectedName + " not found", attr); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/UserAgentFunctionBridgeTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/UserAgentFunctionBridgeTests.java new file mode 100644 index 0000000000000..ea6f3a0e39dd0 --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/evaluator/command/UserAgentFunctionBridgeTests.java @@ -0,0 +1,205 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.evaluator.command; + +import org.elasticsearch.compute.operator.DriverContext; +import org.elasticsearch.compute.operator.WarningSourceLocation; +import org.elasticsearch.compute.operator.Warnings; +import org.elasticsearch.useragent.api.Details; +import org.elasticsearch.useragent.api.UserAgentParser; +import org.elasticsearch.useragent.api.VersionedName; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.DEVICE_NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.DEVICE_TYPE; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_FULL; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_NAME; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.OS_VERSION; +import static org.elasticsearch.useragent.api.UserAgentParsedInfo.VERSION; + +public class UserAgentFunctionBridgeTests extends AbstractCompoundOutputEvaluatorTests { + + private static final String CHROME_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 " + + "(KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36"; + private static final String FIREFOX_UA = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"; + private static final String CURL_UA = "curl/7.68.0"; + + /** + * A test parser that returns known Details for known user-agent strings. + */ + private static final UserAgentParser TEST_PARSER = (agentString, extractDeviceType) -> { + if (CHROME_UA.equals(agentString)) { + return new Details( + "Chrome", + "33.0.1750", + new VersionedName("Mac OS X", "10.9.2"), + "Mac OS X 10.9.2", + new VersionedName("Mac", null), + extractDeviceType ? "Desktop" : null + ); + } else if (FIREFOX_UA.equals(agentString)) { + return new Details( + "Firefox", + "115.0", + new VersionedName("Linux", null), + "Linux", + new VersionedName("Other", null), + extractDeviceType ? "Desktop" : null + ); + } else if (CURL_UA.equals(agentString)) { + return new Details("curl", "7.68.0", null, null, null, null); + } + return new Details(null, null, null, null, null, null); + }; + + private boolean extractDeviceType = false; + + private final Warnings WARNINGS = Warnings.createWarnings(DriverContext.WarningsMode.COLLECT, new WarningSourceLocation() { + @Override + public int lineNumber() { + return 1; + } + + @Override + public int columnNumber() { + return 2; + } + + @Override + public String viewName() { + return null; + } + + @Override + public String text() { + return "invalid_input"; + } + }); + + @Override + protected CompoundOutputEvaluator.OutputFieldsCollector createOutputFieldsCollector(List requestedFields) { + return new UserAgentFunctionBridge.UserAgentCollectorImpl(requestedFields, TEST_PARSER, extractDeviceType); + } + + @Override + protected String collectorSimpleName() { + return UserAgentFunctionBridge.UserAgentCollectorImpl.class.getSimpleName(); + } + + @Override + protected Map> getSupportedOutputFieldMappings() { + return UserAgentFunctionBridge.getAllOutputFields(); + } + + public void testFullOutput() { + extractDeviceType = false; + List requestedFields = List.of(NAME, VERSION, OS_NAME, OS_VERSION, OS_FULL, DEVICE_NAME); + List input = List.of(CHROME_UA); + List expected = List.of("Chrome", "33.0.1750", "Mac OS X", "10.9.2", "Mac OS X 10.9.2", "Mac"); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testFullOutputWithDeviceType() { + extractDeviceType = true; + List requestedFields = List.of(NAME, VERSION, OS_NAME, OS_VERSION, OS_FULL, DEVICE_NAME, DEVICE_TYPE); + List input = List.of(CHROME_UA); + List expected = List.of("Chrome", "33.0.1750", "Mac OS X", "10.9.2", "Mac OS X 10.9.2", "Mac", "Desktop"); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testDeviceTypeNotExtracted() { + extractDeviceType = false; + List requestedFields = List.of(NAME, DEVICE_TYPE); + List input = List.of(CHROME_UA); + List expected = Arrays.asList("Chrome", null); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testPartialFieldsRequested() { + extractDeviceType = false; + List requestedFields = List.of(NAME, VERSION); + List input = List.of(CHROME_UA); + List expected = List.of("Chrome", "33.0.1750"); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testNoOsMatch() { + extractDeviceType = false; + List requestedFields = List.of(NAME, OS_NAME, OS_VERSION, OS_FULL); + List input = List.of(CURL_UA); + List expected = Arrays.asList("curl", null, null, null); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testNoDeviceMatch() { + extractDeviceType = false; + List requestedFields = List.of(NAME, DEVICE_NAME); + List input = List.of(CURL_UA); + List expected = Arrays.asList("curl", null); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testUnknownInput() { + extractDeviceType = false; + List requestedFields = List.of(NAME, VERSION, OS_NAME); + List input = List.of("completely unknown agent string"); + List expected = Arrays.asList(null, null, null); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testUnknownInputWithDeviceType() { + extractDeviceType = true; + List requestedFields = List.of(NAME, VERSION, OS_NAME, OS_VERSION, OS_FULL, DEVICE_NAME, DEVICE_TYPE); + List input = List.of("completely unknown agent string"); + List expected = Arrays.asList(null, null, null, null, null, null, null); + evaluateAndCompare(input, requestedFields, expected); + } + + public void testMultiValue() { + extractDeviceType = false; + List requestedFields = List.of(NAME, VERSION, OS_NAME, OS_VERSION, OS_FULL, DEVICE_NAME); + List input = List.of(CHROME_UA, FIREFOX_UA); + List expected = Collections.nCopies(requestedFields.size(), new Object[] { null }); + evaluateAndCompare(input, requestedFields, expected, WARNINGS); + assertCriticalWarnings( + "Line 1:2: evaluation of [invalid_input] failed, treating result as null. Only first 20 failures recorded.", + "Line 1:2: java.lang.IllegalArgumentException: This command doesn't support multi-value input" + ); + } + + /***************************************************************************************************** + * Implementing AbstractCompoundOutputEvaluatorTests methods for the OperatorTestCase framework + *****************************************************************************************************/ + + @Override + protected List getRequestedFieldsForSimple() { + return List.of(NAME, VERSION, OS_NAME, OS_VERSION, OS_FULL, DEVICE_NAME); + } + + @Override + protected List getSampleInputForSimple() { + return List.of(CHROME_UA, FIREFOX_UA, CURL_UA); + } + + @Override + protected List getExpectedOutputForSimple() { + return List.of( + new Object[] { "Chrome", "Firefox", "curl" }, + new Object[] { "33.0.1750", "115.0", "7.68.0" }, + new Object[] { "Mac OS X", "Linux", null }, + new Object[] { "10.9.2", null, null }, + new Object[] { "Mac OS X 10.9.2", "Linux", null }, + new Object[] { "Mac", "Other", null } + ); + } +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/PhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/PhysicalPlanOptimizerTests.java index ab142a379662b..822e334d31af4 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/PhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/PhysicalPlanOptimizerTests.java @@ -9470,6 +9470,7 @@ private LocalExecutionPlanner.LocalExecutionPlan physicalOperationsFromPhysicalP null, null, null, + null, new EsPhysicalOperationProviders(FoldContext.small(), EmptyIndexedByShardId.instance(), null, PlannerSettings.DEFAULTS), null // OperatorFactoryRegistry - not needed for these tests ); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/UserAgentGoldenTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/UserAgentGoldenTests.java new file mode 100644 index 0000000000000..fab8667ef8425 --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/UserAgentGoldenTests.java @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.optimizer; + +import org.elasticsearch.xpack.esql.EsqlTestUtils; +import org.elasticsearch.xpack.esql.action.EsqlCapabilities; +import org.elasticsearch.xpack.esql.core.expression.FieldAttribute.FieldName; +import org.elasticsearch.xpack.esql.stats.SearchStats; + +import java.util.EnumSet; + +/** + * Golden tests for USER_AGENT command optimizer behavior. + * Consolidates USER_AGENT-related optimizer tests that were previously spread across + * {@link LogicalPlanOptimizerTests}, {@link PhysicalPlanOptimizerTests}, + * {@link LocalPhysicalPlanOptimizerTests}, and + * {@link org.elasticsearch.xpack.esql.optimizer.rules.logical.PushDownAndCombineFiltersTests}. + */ +public class UserAgentGoldenTests extends GoldenTestCase { + + /** + * Filters on fields unrelated to USER_AGENT output should be pushed below USER_AGENT, + * while filters on UA-derived fields (ua.name) must stay above. + */ + public void testPushDownFilterPastUserAgent() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + String query = """ + FROM employees + | WHERE emp_no > 10000 + | user_agent ua = first_name WITH { "extract_device_type": true } + | WHERE ua.name == "Chrome" AND salary > 5000 + """; + runGoldenTest(query, EnumSet.of(Stage.LOGICAL_OPTIMIZATION)); + } + + /** + * USER_AGENT should be pushed below a Project (KEEP) so the optimized tree is + * Project -> UserAgent -> Limit -> EsRelation. + */ + public void testPushDownUserAgentPastProject() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + String query = """ + FROM employees + | rename first_name as x + | keep x + | user_agent ua = x WITH { "extract_device_type": true } + """; + runGoldenTest(query, EnumSet.of(Stage.LOGICAL_OPTIMIZATION)); + } + + /** + * Multiple SORT commands around USER_AGENT should be combined into a single TopN, + * keeping only the later sort order (ua.name). + */ + public void testCombineOrderByThroughUserAgent() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + String query = """ + FROM employees + | sort emp_no + | user_agent ua = first_name WITH { "extract_device_type": true } + | sort ua.name + """; + runGoldenTest(query, EnumSet.of(Stage.LOGICAL_OPTIMIZATION)); + } + + /** + * A filter on a USER_AGENT-derived field (ua.name) must NOT be pushed past UserAgent. + */ + public void testFilterOnUserAgentIsNotPushedDown() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + String query = """ + FROM employees + | user_agent ua = first_name WITH { "extract_device_type": true } + | WHERE ua.name == "Chrome" + """; + runGoldenTest(query, EnumSet.of(Stage.LOGICAL_OPTIMIZATION)); + } + + /** + * When USER_AGENT input is a constant_keyword field with a known value, a WHERE on that + * same field should be folded away (not pushed into EsQueryExec). + */ + public void testConstantFieldUserAgentFilter() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + String query = """ + FROM all_types + | user_agent ua = `constant_keyword-foo` WITH { "extract_device_type": true } + | WHERE `constant_keyword-foo` == "foo" + """; + runGoldenTest(query, EnumSet.of(Stage.LOCAL_PHYSICAL_OPTIMIZATION), CONSTANT_KEYWORD_STATS); + } + + private static final SearchStats CONSTANT_KEYWORD_STATS = new EsqlTestUtils.TestSearchStats() { + @Override + public boolean isSingleValue(FieldName field) { + return true; + } + + @Override + public String constantValue(FieldName name) { + return name.string().startsWith("constant_keyword") ? "foo" : null; + } + }; +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFiltersTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFiltersTests.java index 1fe37607681f6..6b6de5d5c375f 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFiltersTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/rules/logical/PushDownAndCombineFiltersTests.java @@ -2451,4 +2451,5 @@ public void testPushDownFilterPastRegisteredDomain() { as(bottomFilter.child(), EsRelation.class); } + } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java index 602549da72588..fcb57d400082c 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/parser/StatementParserTests.java @@ -37,6 +37,7 @@ import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.evaluator.command.RegisteredDomainFunctionBridge; import org.elasticsearch.xpack.esql.evaluator.command.UriPartsFunctionBridge; +import org.elasticsearch.xpack.esql.evaluator.command.UserAgentFunctionBridge; import org.elasticsearch.xpack.esql.expression.Order; import org.elasticsearch.xpack.esql.expression.UnresolvedNamePattern; import org.elasticsearch.xpack.esql.expression.function.DocsV3Support; @@ -85,6 +86,7 @@ import org.elasticsearch.xpack.esql.plan.logical.TimeSeriesAggregate; import org.elasticsearch.xpack.esql.plan.logical.UnresolvedRelation; import org.elasticsearch.xpack.esql.plan.logical.UriParts; +import org.elasticsearch.xpack.esql.plan.logical.UserAgent; import org.elasticsearch.xpack.esql.plan.logical.fuse.Fuse; import org.elasticsearch.xpack.esql.plan.logical.inference.Completion; import org.elasticsearch.xpack.esql.plan.logical.inference.Rerank; @@ -4691,4 +4693,66 @@ public void testRegisteredDomainCommand() { assertEquals(expectedFieldNames, actualFieldNames); } + public void testUserAgentCommand() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + LogicalPlan cmd = processingCommand("user_agent ua = a "); + UserAgent ua = as(cmd, UserAgent.class); + assertEqualsIgnoringIds(attribute("a"), ua.getInput()); + assertFalse(ua.extractDeviceType()); + assertEquals("_default_", ua.regexFile()); + + List expectedFieldNames = UserAgentFunctionBridge.getAllOutputFields() + .keySet() + .stream() + .filter(name -> name.equals("device.type") == false) + .map(name -> "ua." + name) + .collect(Collectors.toList()); + + List actualFieldNames = ua.generatedAttributes().stream().map(NamedExpression::name).collect(Collectors.toList()); + assertEquals(expectedFieldNames, actualFieldNames); + } + + public void testUserAgentCommandWithOptions() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + LogicalPlan cmd = processingCommand("user_agent ua = a WITH { \"regex_file\": \"custom\", \"extract_device_type\": true }"); + UserAgent ua = as(cmd, UserAgent.class); + assertEqualsIgnoringIds(attribute("a"), ua.getInput()); + assertTrue(ua.extractDeviceType()); + assertEquals("custom", ua.regexFile()); + + List expectedFieldNames = UserAgentFunctionBridge.getAllOutputFields() + .keySet() + .stream() + .map(name -> "ua." + name) + .collect(Collectors.toList()); + + List actualFieldNames = ua.generatedAttributes().stream().map(NamedExpression::name).collect(Collectors.toList()); + assertEquals(expectedFieldNames, actualFieldNames); + } + + public void testUserAgentCommandWithProperties() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + LogicalPlan cmd = processingCommand("user_agent ua = a WITH { \"properties\": [\"name\", \"os\"] }"); + UserAgent ua = as(cmd, UserAgent.class); + + List expectedFieldNames = List.of("ua.name", "ua.os.name", "ua.os.version", "ua.os.full"); + + List actualFieldNames = ua.generatedAttributes().stream().map(NamedExpression::name).collect(Collectors.toList()); + assertEquals(expectedFieldNames, actualFieldNames); + } + + public void testUserAgentCommandInvalidOption() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + expectError( + "row a = \"test\" | user_agent ua = a WITH { \"unknown_option\": \"value\" }", + "Invalid option [unknown_option] in USER_AGENT" + ); + } + + public void testUserAgentCommandOriginalIgnored() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + LogicalPlan cmd = processingCommand("user_agent ua = a WITH { \"original\": true }"); + UserAgent ua = as(cmd, UserAgent.class); + assertEqualsIgnoringIds(attribute("a"), ua.getInput()); + } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CommandLicenseTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CommandLicenseTests.java index 5b31fcbde30b6..21d256a2011ad 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CommandLicenseTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/CommandLicenseTests.java @@ -144,7 +144,9 @@ private static Map> getCommandClasses() { "MetricsInfo", "METRICS_INFO", "TsInfo", - "TS_INFO" + "TS_INFO", + "UserAgent", + "USER_AGENT" ); Map commandPackageMapper = Map.of("Rerank", planPackage + ".inference", "LookupJoin", planPackage + ".join"); Set ignoredClasses = Set.of("Processing", "TimeSeries", "Completion", "Source", "From", "Row"); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/UserAgentSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/UserAgentSerializationTests.java new file mode 100644 index 0000000000000..7df393d7329cd --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/logical/UserAgentSerializationTests.java @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.plan.logical; + +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.evaluator.command.UserAgentFunctionBridge; +import org.elasticsearch.xpack.esql.expression.function.FieldAttributeTests; + +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Objects; +import java.util.SequencedMap; + +public class UserAgentSerializationTests extends CompoundOutputEvalSerializationTests { + + @Override + protected UserAgent createInitialInstance(Source source, LogicalPlan child, Expression input, Attribute outputFieldPrefix) { + boolean extractDeviceType = randomBoolean(); + String regexFile = randomAlphaOfLengthBetween(3, 10); + SequencedMap> filteredFields = randomFilteredFields(extractDeviceType); + return UserAgent.createInitialInstance( + source, + child, + input, + Objects.requireNonNull(outputFieldPrefix), + extractDeviceType, + regexFile, + filteredFields + ); + } + + @Override + protected UserAgent mutateInstance(UserAgent instance) throws IOException { + LogicalPlan child = instance.child(); + Expression input = instance.getInput(); + List outputFieldNames = instance.outputFieldNames(); + List outputFieldAttributes = instance.generatedAttributes(); + boolean extractDeviceType = instance.extractDeviceType(); + String regexFile = instance.regexFile(); + + switch (between(0, 5)) { + case 0 -> child = randomValueOtherThan(child, () -> randomChild(0)); + case 1 -> input = randomValueOtherThan(input, () -> FieldAttributeTests.createFieldAttribute(0, false)); + case 2 -> { + final int nameSize = outputFieldNames.size(); + outputFieldNames = randomValueOtherThan( + outputFieldNames, + () -> randomList(nameSize, nameSize, () -> randomAlphaOfLengthBetween(1, 10)) + ); + } + case 3 -> { + final int attrSize = outputFieldAttributes.size(); + outputFieldAttributes = randomValueOtherThan(outputFieldAttributes, () -> randomFieldAttributes(attrSize, attrSize, false)); + } + case 4 -> extractDeviceType = extractDeviceType == false; + case 5 -> regexFile = randomValueOtherThan(regexFile, () -> randomAlphaOfLengthBetween(3, 10)); + } + return new UserAgent(instance.source(), child, input, outputFieldNames, outputFieldAttributes, extractDeviceType, regexFile); + } + + private SequencedMap> randomFilteredFields(boolean extractDeviceType) { + SequencedMap> allFields = UserAgentFunctionBridge.getAllOutputFields(); + LinkedHashMap> filtered = new LinkedHashMap<>(); + for (var entry : allFields.entrySet()) { + if (entry.getKey().equals("device.type") && extractDeviceType == false) { + continue; + } + if (randomBoolean() || filtered.isEmpty()) { + filtered.put(entry.getKey(), entry.getValue()); + } + } + return filtered; + } +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/UserAgentExecSerializationTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/UserAgentExecSerializationTests.java new file mode 100644 index 0000000000000..868f2124eb31d --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/plan/physical/UserAgentExecSerializationTests.java @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.plan.physical; + +import org.elasticsearch.xpack.esql.core.expression.Attribute; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.expression.function.FieldAttributeTests; + +import java.io.IOException; +import java.util.List; + +public class UserAgentExecSerializationTests extends CompoundOutputEvalExecSerializationTests { + + @Override + protected CompoundOutputEvalExec createInstance( + Source source, + PhysicalPlan child, + Expression input, + List outputFieldNames, + List outputFieldAttributes + ) { + return new UserAgentExec( + source, + child, + input, + outputFieldNames, + outputFieldAttributes, + randomBoolean(), + randomAlphaOfLengthBetween(3, 10) + ); + } + + @Override + protected CompoundOutputEvalExec mutateInstance(CompoundOutputEvalExec instance) throws IOException { + UserAgentExec ua = (UserAgentExec) instance; + PhysicalPlan child = ua.child(); + Expression input = ua.input(); + List outputFieldNames = ua.outputFieldNames(); + List outputFieldAttributes = ua.outputFieldAttributes(); + boolean extractDeviceType = ua.extractDeviceType(); + String regexFile = ua.regexFile(); + + switch (between(0, 5)) { + case 0 -> child = randomValueOtherThan(child, () -> randomChild(0)); + case 1 -> input = randomValueOtherThan(input, () -> FieldAttributeTests.createFieldAttribute(0, false)); + case 2 -> { + final int nameSize = outputFieldNames.size(); + outputFieldNames = randomValueOtherThan( + outputFieldNames, + () -> randomList(nameSize, nameSize, () -> randomAlphaOfLengthBetween(1, 10)) + ); + } + case 3 -> { + final int attrSize = outputFieldAttributes.size(); + outputFieldAttributes = randomValueOtherThan(outputFieldAttributes, () -> randomFieldAttributes(attrSize, attrSize, false)); + } + case 4 -> extractDeviceType = extractDeviceType == false; + case 5 -> regexFile = randomValueOtherThan(regexFile, () -> randomAlphaOfLengthBetween(3, 10)); + } + return new UserAgentExec(ua.source(), child, input, outputFieldNames, outputFieldAttributes, extractDeviceType, regexFile); + } +} diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlannerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlannerTests.java index c0b76f9fd4380..cec9172e8c7c9 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlannerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlannerTests.java @@ -569,6 +569,7 @@ private LocalExecutionPlanner planner(OperatorFactoryRegistry operatorFactoryReg null, null, null, + null, esPhysicalOperationProviders(shardContexts), operatorFactoryRegistry ); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java index f379ba7a60477..ce9407922217c 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/session/FieldNameUtilsTests.java @@ -3378,6 +3378,14 @@ public void testRegisteredDomainResolvesOnlyInput() { | keep rd.registered_domain""", Set.of("_index", "first_name", "first_name.*")); } + public void testUserAgentResolvesOnlyInput() { + assumeTrue("requires user_agent command capability", EsqlCapabilities.Cap.USER_AGENT_COMMAND.isEnabled()); + assertFieldNames(""" + from employees + | user_agent ua = first_name WITH { "extract_device_type": true } + | keep ua.name""", Set.of("_index", "first_name", "first_name.*")); + } + private void assertFieldNames(String query, Set expected) { assertFieldNames(query, false, expected, Set.of()); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/tree/EsqlNodeSubclassTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/tree/EsqlNodeSubclassTests.java index 6cf2c2b23e73b..b88a5284242b0 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/tree/EsqlNodeSubclassTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/tree/EsqlNodeSubclassTests.java @@ -218,6 +218,7 @@ public void testTransform() throws Exception { T node = ctor.newInstance(nodeCtorArgs); Type[] argTypes = ctor.getGenericParameterTypes(); + // start at 1 because we can't change Location. for (int changedArgOffset = 1; changedArgOffset < ctor.getParameterCount(); changedArgOffset++) { Object originalArgValue = nodeCtorArgs[changedArgOffset]; @@ -261,6 +262,7 @@ public void testReplaceChildren() throws Exception { T node = ctor.newInstance(nodeCtorArgs); Type[] argTypes = ctor.getGenericParameterTypes(); + // start at 1 because we can't change Location. for (int changedArgOffset = 1; changedArgOffset < ctor.getParameterCount(); changedArgOffset++) { Object originalArgValue = nodeCtorArgs[changedArgOffset]; diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testCombineOrderByThroughUserAgent/logical_optimization.expected b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testCombineOrderByThroughUserAgent/logical_optimization.expected new file mode 100644 index 0000000000000..8ebd4405d08d0 --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testCombineOrderByThroughUserAgent/logical_optimization.expected @@ -0,0 +1,3 @@ +TopN[[Order[ua.name{r}#0,ASC,LAST]],1000[INTEGER],false] +\_UserAgent[first_name{f}#1,[name, version, os.name, os.version, os.full, device.name, device.type],[ua.name{r}#0, ua.version{r}#2, ua.os.name{r}#3, ua.os.version{r}#4, ua.os.full{r}#5, ua.device.name{r}#6, ua.device.type{r}#7],true,_default_] + \_EsRelation[employees][avg_worked_seconds{f}#8, birth_date{f}#9, emp_no{f}#10, first_name{f}#1, gender{f}#11, height{f}#12, height.float{f}#13, height.half_float{f}#14, height.scaled_float{f}#15, hire_date{f}#16, is_rehired{f}#17, job_positions{f}#18, languages{f}#19, languages.byte{f}#20, languages.long{f}#21, languages.short{f}#22, last_name{f}#23, salary{f}#24, salary_change{f}#25, salary_change.int{f}#26, salary_change.keyword{f}#27, salary_change.long{f}#28, still_hired{f}#29] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testCombineOrderByThroughUserAgent/query.esql b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testCombineOrderByThroughUserAgent/query.esql new file mode 100644 index 0000000000000..23a311f8546b7 --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testCombineOrderByThroughUserAgent/query.esql @@ -0,0 +1,4 @@ +FROM employees +| sort emp_no +| user_agent ua = first_name WITH { "extract_device_type": true } +| sort ua.name diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testConstantFieldUserAgentFilter/local_physical_optimization.expected b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testConstantFieldUserAgentFilter/local_physical_optimization.expected new file mode 100644 index 0000000000000..0a7e9919878a5 --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testConstantFieldUserAgentFilter/local_physical_optimization.expected @@ -0,0 +1,6 @@ +UserAgentExec[constant_keyword-foo{f}#0,[name, version, os.name, os.version, os.full, device.name, device.type],[ua.name{r}#1, ua.version{r}#2, ua.os.name{r}#3, ua.os.version{r}#4, ua.os.full{r}#5, ua.device.name{r}#6, ua.device.type{r}#7],true,_default_] +\_LimitExec[1000[INTEGER],null] + \_ExchangeExec[[!alias_integer, boolean{f}#8, byte{f}#9, constant_keyword-foo{f}#0, date{f}#10, date_nanos{f}#11, dense_vector{f}#12, double{f}#13, float{f}#14, half_float{f}#15, integer{f}#16, ip{f}#17, keyword{f}#18, long{f}#19, scaled_float{f}#20, semantic_text{f}#21, short{f}#22, text{f}#23, unsigned_long{f}#24, version{f}#25, wildcard{f}#26],false] + \_ProjectExec[[!alias_integer, boolean{f}#8, byte{f}#9, constant_keyword-foo{f}#0, date{f}#10, date_nanos{f}#11, dense_vector{f}#12, double{f}#13, float{f}#14, half_float{f}#15, integer{f}#16, ip{f}#17, keyword{f}#18, long{f}#19, scaled_float{f}#20, semantic_text{f}#21, short{f}#22, text{f}#23, unsigned_long{f}#24, version{f}#25, wildcard{f}#26]] + \_FieldExtractExec[!alias_integer, boolean{f}#8, byte{f}#9, constant_keyword-foo{f}#0, date{f}#10, date_nanos{f}#11, dense_vector{f}#12, double{f}#13, float{f}#14, half_float{f}#15, integer{f}#16, ip{f}#17, keyword{f}#18, long{f}#19, scaled_float{f}#20, semantic_text{f}#21, short{f}#22, text{f}#23, unsigned_long{f}#24, version{f}#25, wildcard{f}#26]<[],[],[]> + \_EsQueryExec[all_types], indexMode[standard], [_doc{f}#27], limit[1000], sort[] estimatedRowSize[7430] queryBuilderAndTags [[QueryBuilderAndTags[query=null, tags=[]]]] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testConstantFieldUserAgentFilter/query.esql b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testConstantFieldUserAgentFilter/query.esql new file mode 100644 index 0000000000000..fbadf7d0d75df --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testConstantFieldUserAgentFilter/query.esql @@ -0,0 +1,3 @@ +FROM all_types +| user_agent ua = `constant_keyword-foo` WITH { "extract_device_type": true } +| WHERE `constant_keyword-foo` == "foo" diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testFilterOnUserAgentIsNotPushedDown/logical_optimization.expected b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testFilterOnUserAgentIsNotPushedDown/logical_optimization.expected new file mode 100644 index 0000000000000..411f192ea8262 --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testFilterOnUserAgentIsNotPushedDown/logical_optimization.expected @@ -0,0 +1,4 @@ +Limit[1000[INTEGER],false,false] +\_Filter[ua.name{r}#0 == Chrome[KEYWORD]] + \_UserAgent[first_name{f}#1,[name, version, os.name, os.version, os.full, device.name, device.type],[ua.name{r}#0, ua.version{r}#2, ua.os.name{r}#3, ua.os.version{r}#4, ua.os.full{r}#5, ua.device.name{r}#6, ua.device.type{r}#7],true,_default_] + \_EsRelation[employees][avg_worked_seconds{f}#8, birth_date{f}#9, emp_no{f}#10, first_name{f}#1, gender{f}#11, height{f}#12, height.float{f}#13, height.half_float{f}#14, height.scaled_float{f}#15, hire_date{f}#16, is_rehired{f}#17, job_positions{f}#18, languages{f}#19, languages.byte{f}#20, languages.long{f}#21, languages.short{f}#22, last_name{f}#23, salary{f}#24, salary_change{f}#25, salary_change.int{f}#26, salary_change.keyword{f}#27, salary_change.long{f}#28, still_hired{f}#29] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testFilterOnUserAgentIsNotPushedDown/query.esql b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testFilterOnUserAgentIsNotPushedDown/query.esql new file mode 100644 index 0000000000000..06ae33312d2de --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testFilterOnUserAgentIsNotPushedDown/query.esql @@ -0,0 +1,3 @@ +FROM employees +| user_agent ua = first_name WITH { "extract_device_type": true } +| WHERE ua.name == "Chrome" diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownFilterPastUserAgent/logical_optimization.expected b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownFilterPastUserAgent/logical_optimization.expected new file mode 100644 index 0000000000000..9eaff1727588a --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownFilterPastUserAgent/logical_optimization.expected @@ -0,0 +1,5 @@ +Limit[1000[INTEGER],false,false] +\_Filter[ua.name{r}#0 == Chrome[KEYWORD]] + \_UserAgent[first_name{f}#1,[name, version, os.name, os.version, os.full, device.name, device.type],[ua.name{r}#0, ua.version{r}#2, ua.os.name{r}#3, ua.os.version{r}#4, ua.os.full{r}#5, ua.device.name{r}#6, ua.device.type{r}#7],true,_default_] + \_Filter[emp_no{f}#8 > 10000[INTEGER] AND salary{f}#9 > 5000[INTEGER]] + \_EsRelation[employees][avg_worked_seconds{f}#10, birth_date{f}#11, emp_no{f}#8, first_name{f}#1, gender{f}#12, height{f}#13, height.float{f}#14, height.half_float{f}#15, height.scaled_float{f}#16, hire_date{f}#17, is_rehired{f}#18, job_positions{f}#19, languages{f}#20, languages.byte{f}#21, languages.long{f}#22, languages.short{f}#23, last_name{f}#24, salary{f}#9, salary_change{f}#25, salary_change.int{f}#26, salary_change.keyword{f}#27, salary_change.long{f}#28, still_hired{f}#29] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownFilterPastUserAgent/query.esql b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownFilterPastUserAgent/query.esql new file mode 100644 index 0000000000000..38699002f9902 --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownFilterPastUserAgent/query.esql @@ -0,0 +1,4 @@ +FROM employees +| WHERE emp_no > 10000 +| user_agent ua = first_name WITH { "extract_device_type": true } +| WHERE ua.name == "Chrome" AND salary > 5000 diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownUserAgentPastProject/logical_optimization.expected b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownUserAgentPastProject/logical_optimization.expected new file mode 100644 index 0000000000000..0aad2338737e4 --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownUserAgentPastProject/logical_optimization.expected @@ -0,0 +1,4 @@ +Project[[first_name{f}#0 AS x#1, ua.name{r}#2, ua.version{r}#3, ua.os.name{r}#4, ua.os.version{r}#5, ua.os.full{r}#6, ua.device.name{r}#7, ua.device.type{r}#8]] +\_UserAgent[first_name{f}#0,[name, version, os.name, os.version, os.full, device.name, device.type],[ua.name{r}#2, ua.version{r}#3, ua.os.name{r}#4, ua.os.version{r}#5, ua.os.full{r}#6, ua.device.name{r}#7, ua.device.type{r}#8],true,_default_] + \_Limit[1000[INTEGER],false,false] + \_EsRelation[employees][avg_worked_seconds{f}#9, birth_date{f}#10, emp_no{f}#11, first_name{f}#0, gender{f}#12, height{f}#13, height.float{f}#14, height.half_float{f}#15, height.scaled_float{f}#16, hire_date{f}#17, is_rehired{f}#18, job_positions{f}#19, languages{f}#20, languages.byte{f}#21, languages.long{f}#22, languages.short{f}#23, last_name{f}#24, salary{f}#25, salary_change{f}#26, salary_change.int{f}#27, salary_change.keyword{f}#28, salary_change.long{f}#29, still_hired{f}#30] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownUserAgentPastProject/query.esql b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownUserAgentPastProject/query.esql new file mode 100644 index 0000000000000..292ad731099bd --- /dev/null +++ b/x-pack/plugin/esql/src/test/resources/org/elasticsearch/xpack/esql/optimizer/golden_tests/UserAgentGoldenTests/testPushDownUserAgentPastProject/query.esql @@ -0,0 +1,4 @@ +FROM employees +| rename first_name as x +| keep x +| user_agent ua = x WITH { "extract_device_type": true } diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml index 01cbdda490857..a2c11af712a32 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/60_usage.yml @@ -61,6 +61,7 @@ setup: - promql_command_v0 - uri_parts_command - registered_domain_command + - user_agent_command - fn_json_extract reason: "Test that should only be executed on snapshot versions" @@ -100,6 +101,7 @@ setup: - set: { esql.features.view: view_counter } - set: { esql.features.uri_parts: uri_parts_counter } - set: { esql.features.registered_domain: registered_domain_counter } + - set: { esql.features.user_agent: user_agent_counter } - set: { esql.features.mmr: mmr_counter } - length: { esql.queries: 3 } - set: { esql.queries.rest.total: rest_total_counter } @@ -134,6 +136,7 @@ setup: - match: { esql.features.grok: $grok_counter } - match: { esql.features.uri_parts: $uri_parts_counter } - match: { esql.features.registered_domain: $registered_domain_counter } + - match: { esql.features.user_agent: $user_agent_counter } - gt: { esql.features.limit: $limit_counter } - gt: { esql.features.sort: $sort_counter } - gt: { esql.features.stats: $stats_counter } @@ -189,6 +192,7 @@ setup: - match: { esql.features.grok: $grok_counter } - match: { esql.features.uri_parts: $uri_parts_counter } - match: { esql.features.registered_domain: $registered_domain_counter } + - match: { esql.features.user_agent: $user_agent_counter } - match: { esql.features.limit: $limit_counter } - match: { esql.features.sort: $sort_counter } - gt: { esql.features.stats: $stats_counter } @@ -266,6 +270,7 @@ setup: - set: { esql.features.subquery: subquery_counter } - set: { esql.features.uri_parts: uri_parts_counter } - set: { esql.features.registered_domain: registered_domain_counter } + - set: { esql.features.user_agent: user_agent_counter } - set: { esql.features.mmr: mmr_counter } - length: { esql.queries: 3 } - set: { esql.queries.rest.total: rest_total_counter } @@ -299,6 +304,7 @@ setup: - match: { esql.features.grok: $grok_counter } - match: { esql.features.uri_parts: $uri_parts_counter } - match: { esql.features.registered_domain: $registered_domain_counter } + - match: { esql.features.user_agent: $user_agent_counter } - gt: { esql.features.limit: $limit_counter } - gt: { esql.features.sort: $sort_counter } - gt: { esql.features.stats: $stats_counter }